2013-04-19 12 views
5

Ho una grande rete memorizzata in Neo4j. Basato su un particolare nodo root, voglio estrarre un sottografo attorno a quel nodo e memorizzarlo da qualche altra parte. Quindi, quello di cui ho bisogno è l'insieme di nodi e spigoli che corrispondono ai miei criteri di filtro.Estrarre il sottografo in neo4j

Afaik non è disponibile una soluzione pronta per l'uso. C'è un graph matching component available, ma funziona solo per le partite perfette. L'API Neo4j si definisce solo graph traversal che posso utilizzare per definire quali nodi/bordi devono essere visitati:

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

Ora, posso aggiungere tutti i nodi/bordi ai set per tutti i percorsi, ma questo è molto inefficiente. Come lo faresti? Grazie!

EDIT Avrebbe senso aggiungere l'ultimo nodo e l'ultima relazione di ogni attraversamento al sottografo?

risposta

2

ho risolto costruendo il sottografo indotto basato su tutti gli endpoint trasversali.

Costruire il sottografo dall'insieme degli ultimi nodi e bordi di ogni attraversamento non funziona, perché i bordi che non fanno parte di alcun percorso più breve non verrebbero inclusi.

Il frammento di codice simile a questo:

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); 
    } 
} 

Ogni bordo si aggiunge due volte. Una volta per il nodo in uscita e una volta per il nodo in entrata. Usando un Set, posso assicurarmi che sia nella collezione solo una volta.

È possibile iterare solo sui bordi in entrata/in uscita, ma non è chiaro come vengono gestiti i loop (da bordo a nodo). A quale categoria appartengono? Questo snippet non presenta questo problema.

3

Come per la corrispondenza del grafico, che è stato sostituito da http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html che si adatta perfettamente e supporta fuzzy matchin con relazioni opzionali.

Per la rappresentazione sottografo, vorrei utilizzare l'uscita Cypher per costruire forse nuove dichiarazioni Cypher per ricreare il grafico, molto simile a un export SQL, qualcosa come

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

http://console.neo4j.org/r/pqf1rp per un esempio

0

Vedi dumping the database to cypher statements

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

C'è anche un esempio per l'importazione del sottografo di primo database (DB1) in una seconda (DB2).