2017-06-08 3 views
1

Ich greife auf die neo4j-Datenbank über GraphDatabaseService. Ich habe einige Knoten und Beziehungen hinzugefügt und möchte eine Abfrage durchführen. Mein Ziel ist es, alle Knoten zu bekommen, die eine Calling-Beziehung zum Endknoten haben. Also habe ich die ganzen Wege zu diesem Knoten. (ZB: node1 -calling-> Knoten2 auffordern * -> nodeX -calling-> Endknoten)Abfrage auf neo4j-Datenbank von Java ausführen, Analyse des Ergebnisses

habe ich versucht, so etwas wie dieses:

GraphDatabaseService _graphDatabase; // db is running and working fine 
Node node;//given by the function call 

HashMap<String, Object> properties = Maps.newHashMap(); 
properties.put("name", getPropertyFromNode(node, "name")); 
String query = "MATCH p=(startnode)-[rel:CALLING*]->(endnode) WHERE endnode.name = {name} RETURN p"; 

Result result = _graphDatabase.execute(query, properties); 
while (result.hasNext()) { 
    Map<String, Object> next = result.next(); 
    next.forEach((k, v) -> { 
     System.out.println(k + " : " + v.toString()); 
     if (v instanceof PathImpl) { 
      PathImpl pathImpl = (PathImpl) v; 
      String startNodeName = getPropertyFromNode(pathImpl.startNode(), "name"); 
      String endNodeName = getPropertyFromNode(pathImpl.endNode(), "name"); 
      System.out.println(startNodeName + " -calling-> " + endNodeName); 
     } 
    }); 
} 

public String getPropertyFromNode(Node node, String propertyName) { 
    String result = null; 
    try (Transaction transaction = _graphDatabase.beginTx()) { 
     result =node.getProperty(propertyName).toString(); 
     transaction.success(); 
    } 
    return result; 
} 

Problem für mich ist, dass das Ergebnis eine Karte ist < 'String, Object> und ich möchte die IDs oder Namen der Knoten, die in der Beziehung sind. Ich habe versucht, das Objekt zu PathImpl zu werfen, weil das der Typ ist, der zurückgegeben wird (durch Debug ermittelt), aber es scheint, dass diese Klasse in einem anderen Klassenlader ist, so dass die Anweisung instanceof false zurückgibt. v.toString() gibt eine String-Repräsentation der gelinkten Knoten mit IDs zurück (zB: p: (24929) - [CALLING, 108061] -> (24930))

Meine Frage ist, kann ich darauf zugreifen Informationen in einer besseren Weise oder wie kann ich den ClassLoader ändern (wenn das das Problem ist, arbeite ich mit Eclipse in einem Großprojekt) um diese Besetzung passiert zu machen. Ich will nicht die Zeichenfolge analysieren, um die IDs zu bekommen und die Knoten aus der db über diese Eigenschaft, seine Nähte hässlich für mich.

Antwort

0

Nach cybersam gültigen Antwort versuchen, die Chiffre-Abfrage zu ändern, entdeckte ich eine andere Art und Weise, ohne diese Abfrage zu ändern, dass mein Ziel besser passt. Für mich war das Ziel, den ganzen Pfad nicht nur den Namen/die ID der verknüpften Knoten zu erhalten. Diese Information ist genau wie ich will in dem Parameter 'p' (siehe Query), aber ich konnte diesen Typ nicht darstellen. Der Grund dafür war, dass Neo4j eine interne Implementierung von PathImpl verwendet. Um meine Lösung in der Frage arbeiten zu lassen, muss ich Path anstelle von PathImpl verwenden, so dass ich den internen Typ nicht importieren muss. Also änderte ich die Importe aus:

import org.neo4j.graphalgo.impl.util.PathImpl; 

zu

import org.neo4j.graphdb.Path; 

und Test für Pfad statt PathImpl.

if (v instanceof Path) { 
    Path path = (Path) v; 
    Iterable<Node> nodes = path.nodes(); 
    nodes.forEach(n -> System.out.println(n.toString())); 
} 

Jetzt kann ich den gesamten Pfad zugreifen. Hoffnung, die auch anderen Menschen hilft.

1

Wenn Sie die Namen der Start- und Endknoten erhalten möchten, sollten Sie den Cypher-Code ändern, um sie zurückzugeben (statt der Pfade), was den Code zum Extrahieren dieser Daten aus der Antwort erheblich vereinfachen würde. Zum Beispiel:

MATCH p=(startnode)-[rel:CALLING*]->(endnode) 
WHERE endnode.name = {name} 
RETURN startnode.name AS s_name, endnode.name AS e_name, p; 
+0

sieht aus wie ich zu tief in die Lösung dieses Problems mit Java anstatt zweimal über die Abfrage cipher, thx – Stefan

+0

Problem auf diese Weise ist im verlieren die Informationen über die Beziehung zwischen den Knoten ... so habe ich eine Liste von allen Knoten ja, aber ich weiß nicht wie der Pfad aussieht – Stefan

+0

Um auch den Pfad zu bekommen, muss man einfach den Pfad 'p' in die' RETURN' Klausel einfügen. Ich habe meine Antwort aktualisiert. – cybersam

Verwandte Themen