neo4j

2010-06-02 20 views
5

का उपयोग करके दिए गए नोड्स के संबंधों वाले नोड सेट को खोजने के लिए कुशल तरीका है क्या उनके दो नोड्स (परिभाषित रिश्तों के साथ) के सेट को खोजने के लिए दो नोड्स के साथ एक कुशल तरीका है।neo4j

उदाहरण के लिए, नोड्स A1, B1, C1 होने - C4 रिश्तों x और y के साथ जुड़े हुए:

A1 --x--> C1 
A1 --x--> C2 
A1 --x--> C3 
B1 --y--> C2 
B1 --y--> C3 
B1 --y--> C4 

A1(x) और B1(y) के लिए एक आम नोड सेट [C2, C3] होगा।

उत्तर

4

कई मामलों में प्रदर्शन में सुधार के लिए डोमेन की संरचना का लाभ उठाया जा सकता है। आइए मान लें कि आप जानते हैं कि B इकाइयों पर y संबंधों की तुलना में आपके A इकाइयों में कम x संबंध हैं। फिर आप ए नोड से दो चरणों को पार कर सकते हैं और देख सकते हैं कि B नोड कहां दिखाता है, और इस तरह C नोड्स को फ़िल्टर करें। यहाँ इस दृष्टिकोण के लिए कुछ कोड है:

Set<Node> found = new HashSet<Node>(); 
for (Relationship firstRel : a1.getRelationships(Reltypes.x, Direction.OUTGOING)) 
{ 
    Node cNode = firstRel.getEndNode(); 
    for (Relationship secondRel : cNode.getRelationships(Reltypes.y, Direction.INCOMING)) 
    { 
     Node bNode = secondRel.getStartNode(); 
     if (bNode.equals(b1)) 
     { 
      found.add(cNode); 
      break; 
     } 
    } 
} 

एक और तरीका है दो धागे कि दोनों ओर से संबंधों को स्कैन शुरू करने के लिए किया जाएगा।

एक तीसरा दृष्टिकोण एक विशेष इंडेक्स बनाना होगा जो इस तरह के प्रश्नों का उत्तर देने में मदद करेगा, जो स्पष्ट रूप से सम्मिलित प्रदर्शन को चोट पहुंचाएगा।

8

दुष्टात्मा में (http://gremlin.tinkerpop.com), इस तरह के रूप में व्यक्त किया जाता है: Seta पर

  1. शुरुआत (A1, A2, A3 अपने उदाहरण में):

    setA._().out('x').in('y').retain(setB).back(2) 
    

    यहां प्रत्येक कदम करता है।

  2. एक Gremlin पाइपलाइन शुरू करें।
  3. उन सेटए शिखर से सी 1, सी 2 और सी 3 तक आउटगोइंग "एक्स" लेबल वाले किनारों को ले जाएं।
  4. आने वाले "वाई" लेबल वाले किनारों को सी 1, सी 2 और सी 3 से लें।
  5. सेटब में नहीं सभी चरणों को फ़िल्टर करें (इस प्रकार, केवल सी 2 और सी 3 पथ मौजूद हैं)।
  6. 2 चरणों पहले आपने जो देखा उसे वापस जाएं - इस प्रकार, सी 2 और सी 3।

ताडा!

शुभकामनाएं, मार्को।

http://markorodriguez.com

+0

मैं GremlinePipeline वस्तु से कोने प्राप्त करना चाहते हैं, तो आप कृपया मुझे बताओ कैसे जावा एपीआई में यह हासिल करने के लिए कर सकते हैं। नीचे वह कोड है जिसका मैं उपयोग कर रहा हूं: GremlinPipeline pipeline = new GremlinPipeline (vert) .out ("LIVES_IN_CITY")। ("LIVES_IN_CITY")। फ़िल्टर (नया पाइप फ़ंक्शन() {सार्वजनिक बूलियन गणना (Vertex v) {वापसी v। getProperty ("name")। बराबर (शहर);}})। पीछे (2) .out ("LIVES_IN_CITY"); – RCS

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

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