Ich habe Probleme mit dem Parameter in der Chiffre in Neo4J von Java. Ich führe die eingebettete Datenbank aus.Wie setze ich in Neo4J das Label als Parameter in einer Abfrage von Java?
Der Code sollte wie folgt sein (GraphDB.cypher geht direkt an die 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);
aber es endet in dieser Ausnahme
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"
Die Dokumentation (und Tutorial) erzählt die verwenden {}, um die Parameter abzudecken, ABER dies wird auch als die cpher-json-Notation für Eigenschaften verwendet. @see http://docs.neo4j.org/chunked/milestone/tutorials-cypher-parameters-java.html
Gibt es eine andere Möglichkeit, dieses Problem zu lösen, anstatt den Aufbau der Query-String wie folgt aus (oder mit anderen Template-Methoden)
GraphDB.cypher("MATCH (n:" + labelName + ")-[r:" + relationName + "]->...
Dies ist erforderlich, da die Zielmarke ändern kann, und ich will um den Code vollständig wiederzuverwenden.
Vielen Dank im Voraus.
[[EDITED A (seufz) nach dem Aufstehen NO AS ANTWORT]]
Da diese Form der Parameter ist derzeit (2014,6) nicht unterstützt wird, ich werde ein wenig replacer rechts laufen, bevor die Abfrage gesendet wird.
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);
}
kann es eine readble
Nun ja, Sie statisch Abfragevorlagen definieren können, aber das ist irgendwie aus Neo4j Umfang diese Art von Funktionen zur Verfügung zu stellen, nicht du denkst? – Rolf
@Raxa, Ihre Lösung mit "Ersatz" ist sehr interessant. Auf den ersten Blick scheint Ihre Verwendung von "# theLabel1 #" statisch zu sein und hat somit das eigentliche Problem, Cypher 'label' mit' parameter' zu bezeichnen, nicht dynamisch angegangen. Wenn es jedoch einfach als ein Platzhalter angesehen wird, der durch die Übereinstimmung in "Parameter" ersetzt werden soll, erreicht es eine dynamische Übergabe von "Label".Ich bin mir nicht sicher, ob es eine Standardlösung gibt, aber es ist eine ziemlich interessante Abschwächung. – Causality