2013-04-19 24 views
5

Ich habe ein großes Netzwerk in Neo4j gespeichert. Basierend auf einem bestimmten Wurzelknoten möchte ich einen Untergraphen um diesen Knoten extrahieren und ihn woanders speichern. Also, was ich brauche, ist der Satz von Knoten und Kanten, die meinen Filterkriterien entsprechen.Extract Subgraph in Neo4j

Afaik gibt es keine Out-of-the-Box-Lösung zur Verfügung. Es gibt eine graph matching component available, aber es funktioniert nur für perfekte Übereinstimmungen. Die Neo4j API selbst definiert nur graph traversal, die ich verwenden können, um zu definieren, welche Knoten/Kanten besucht werden sollten:

Traverser exp = Traversal 
    .description() 
    .breadthFirst() 
    .evaluator(Evaluators.toDepth(2)) 
    .traverse(root); 

Nun, ich alle Knoten hinzufügen/Kanten-Sets für alle Pfade, aber das ist sehr ineffizient. Wie würdest du es machen? Vielen Dank!

BEARBEITEN Wäre es sinnvoll, den letzten Knoten und die letzte Beziehung jedes Durchlaufs zum Untergraphen hinzuzufügen?

Antwort

2

I gelöst Er konstruiert den induzierten Teilgraphen basierend auf allen traversalen Endpunkten.

Das Erstellen des Untergraphen aus der Menge der letzten Knoten und Kanten jedes Durchlaufs funktioniert nicht, da Kanten, die nicht zu den kürzesten Wegen gehören, nicht berücksichtigt werden.

Das Code-Snippet sieht wie folgt aus:

Set<Node> nodes = new HashSet<Node>(); 
Set<Relationship> edges = new HashSet<Relationship>(); 

for (Node n : traverser.nodes()) 
{ 
    nodes.add(n); 
} 

for (Node node : nodes) 
{ 
    for (Relationship rel : node.getRelationships()) 
    { 
     if (nodes.contains(rel.getOtherNode(node))) 
      edges.add(rel); 
    } 
} 

Jede Kante zweimal hinzugefügt wird. Einmal für den ausgehenden Knoten und einmal für den eingehenden Knoten. Mit einem Set kann ich sicherstellen, dass es nur einmal in der Sammlung ist.

Es ist möglich, nur über eingehende/ausgehende Kanten zu iterieren, aber es ist unklar, wie Schleifen (Kante von einem Knoten zu sich selbst) gehandhabt werden. Zu welcher Kategorie gehören sie? Dieses Snippet enthält dieses Problem nicht.

3

Wie für Graph Matching, die durch http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html ersetzt wurde, die gut passen würde, und unterstützt Fuzzy Matchin mit optionalen Beziehungen.

Für Subgraphen Darstellung, würde ich den Cypher Ausgang vielleicht nutzen, um neue Cypher-Anweisungen erstellen die Grafik für neu zu erstellen, ähnlich wie ein SQL-Export, so etwas wie

start n=node:node_auto_index(name='Neo') 
match n-[r:KNOWS*]-m 
return "create ({name:'"+m.name+"'});" 

http://console.neo4j.org/r/pqf1rp für ein Beispiel

0

Siehe dumping the database to cypher statements

dump START n=node({self}) MATCH p=(n)-[r:KNOWS*]->(m) RETURN n,r,m; 

Es gibt auch ein Beispiel für die Subgraphen der ersten Datenbank (DB1) in eine zweite (db2) für den Import.