neo4j

2013-04-19 17 views
5

में सबग्राफ निकालें मेरे पास नियो 4j में संग्रहीत एक बड़ा नेटवर्क है। किसी विशेष रूट नोड के आधार पर, मैं उस नोड के चारों ओर एक सबग्राफ निकालना चाहता हूं और उसे कहीं और स्टोर करना चाहता हूं। तो, मुझे जो चाहिए वह नोड्स और किनारों का सेट है जो मेरे फ़िल्टर मानदंड से मेल खाते हैं।neo4j

अफैइक कोई आउट-ऑफ-द-बॉक्स समाधान उपलब्ध नहीं है। graph matching component available है, लेकिन यह केवल सही मिलान के लिए काम करता है। Neo4j एपीआई खुद को परिभाषित करता है केवल graph traversal जो मैं जो नोड परिभाषित करने के लिए उपयोग कर सकते हैं/किनारों का दौरा किया जाना चाहिए:

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

अब, मैं सभी रास्ते के लिए सेट करने के लिए सभी नोड्स/किनारों को जोड़ सकते हैं, लेकिन यह बहुत अक्षम है। आपको इसे कैसे करना होगा? धन्यवाद!

EDIT क्या यह अंतिम नोड और उप-अनुच्छेद के प्रत्येक ट्रैवर्सल के अंतिम संबंध को जोड़ने का अर्थ होगा?

उत्तर

2

मैं हल यह सभी ट्रैवर्सल एंडपॉइंट्स के आधार पर प्रेरित सबग्राफ का निर्माण करके।

अंतिम नोड्स के सेट से उपग्राफ बनाना और प्रत्येक ट्रैवर्सल के किनारों पर काम नहीं करता है, क्योंकि किनारों को किसी भी सबसे कम पथ का हिस्सा नहीं शामिल किया जाएगा।

कोड स्निपेट इस तरह दिखता है:

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

हर किनारे दो बार जोड़ा जाता है। आउटगोइंग नोड के लिए एक बार और आने वाले नोड के लिए एक बार। एक सेट का उपयोग करके, मैं यह सुनिश्चित कर सकता हूं कि यह केवल एक बार संग्रह में है।

केवल इनकमिंग/आउटगोइंग किनारों पर फिर से शुरू करना संभव है, लेकिन यह स्पष्ट नहीं है कि कैसे लूप (नोड से किनारे तक) को संभाला जाता है। वे किस श्रेणी से संबंधित हैं? इस स्निपेट में यह समस्या नहीं है।

3

ग्राफ मिलान के लिए, जिसे http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html से हटा दिया गया है जो अच्छी तरह से फिट होगा, और वैकल्पिक संबंधों के साथ अस्पष्ट मिलान का समर्थन करेगा।

subgraph प्रतिनिधित्व के लिए, मैं साइफर उत्पादन ज्यादा किसी SQL निर्यात की तरह कुछ की तरह

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

http://console.neo4j.org/r/pqf1rp एक उदाहरण के लिए उपयोग हो सकता है ग्राफ पुनः बनाने के लिए नए साइफर बयान के निर्माण के लिए होता है,,

0

देखें dumping the database to cypher statements

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

वहाँ भी एक दूसरे (डीबी 2) में पहला डाटाबेस (DB1) की subgraph आयात करने के लिए एक उदाहरण है।

 संबंधित मुद्दे