Ho problemi con i parametri in cypher in Neo4J da Java. Eseguo il database incorporato.In Neo4J, come impostare l'etichetta come parametro in una query cifrata da Java?
Il codice dovrebbe essere simile a questo (GraphDB.cypher va direttamente al ExecutionEngine)
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("theLabel1", "Group");
parameter.put("theRelation", "isMemberOf");
parameter.put("theLabel2", "Person");
GraphDB.cypher("MATCH (n1:{theLabel1})-[r:{theRelation}]->(n2:{theLabel2}) RETURN n1, r, n2", parameter);
ma finisce in questa eccezione
Exception in thread "main" Invalid input '{': expected whitespace or a label name (line 1, column 11)
"MATCH (n1:{theLabel1})-[r:{theRelation}]->(n2:{theLabel2}) RETURN n1, r, n2"
La documentazione (e tutorial) dice di utilizzare il {} per coprire i parametri, MA questo viene anche usato come notazione di cypher json per le proprietà. @see http://docs.neo4j.org/chunked/milestone/tutorials-cypher-parameters-java.html
C'è un altro modo per risolvere questo problema piuttosto che costruire la stringa di query come questo (o con altri metodi di template)
GraphDB.cypher("MATCH (n:" + labelName + ")-[r:" + relationName + "]->...
Ciò è necessario perché l'etichetta di destinazione può cambiare e voglio riutilizzare il codice completamente.
Grazie in anticipo.
[[Modificato dopo aver ottenuto un (sigh) NO COME RISPOSTA]]
Dal momento che questa forma di parametro è attualmente (2.014,6) non supportato, mi verrà eseguito un po 'di sostituto del diritto prima di inviare la query.
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("theLabel1", "Group");
parameter.put("theRelation", "isMemberOf");
parameter.put("theLabel2", "Person");
parameter.put("aName", "Donald Duck");
GraphDB.cypher("MATCH (n1:#theLabel1#)-[r:#theRelation#]->(n2:#theLabel2#) WHERE n2.Name = {aName} RETURN n1, r, n2", parameter);
... with ...
public static ExecutionResult cypher(String query, Map<String, Object> params) {
for (String key : params.keySet()) {
query = query.replaceAll("#" + key + "#", String.valueOf(params.get(key)));
}
return params == null ? cypherEngine.execute(query) : cypherEngine.execute(query, params);
}
Non ci può essere un altro readble
Beh, sì, è possibile definire in modo statico modelli di query, ma questo è un pò fuori portata Neo4j per fornire questo tipo di caratteristiche, non lo fanno tu pensi? – Rolf
@Raxa, la tua soluzione con "replacer" è molto interessante. A prima vista, l'uso di "# theLabel1 #" sembra statico, quindi non ha risolto il vero problema di specificare Cypher 'label' con' parameter' "dynamically". Ma quando viene considerato semplicemente un segnaposto che deve essere sostituito dall'incontro in 'parametro', ottiene il passaggio dell'etichetta in modo dinamico.Non sono sicuro se ci sia qualche soluzione standard in arrivo, ma è una mitigazione piuttosto interessante. – Causality