2013-06-01 5 views
9

तो मैंने neo4j में देखा, और मैं इसे आगामी प्रोजेक्ट में उपयोग कर रहा हूं क्योंकि इसका डेटा मॉडल मेरी परियोजना को बहुत अच्छी तरह से फिट कर सकता है। मैंने दस्तावेज़ों को देखा लेकिन मुझे अभी भी इस प्रश्न का उत्तर चाहिए:neo4j: एक दिशात्मक/दो दिशात्मक संबंध?

क्या मैं संबंधों को एक दिशात्मक बनाने के लिए सेट कर सकता हूं?

ऐसा लगता है कि neo4j लोगों को फिल्में पसंद है तो चलिए इसके साथ जारी रखें। अगर मेरे पास ऐसा ग्राफ है:

Actor A -> [:Acts in] -> Movie B 

तो दिशा स्पष्ट है, क्योंकि नोड्स अलग-अलग प्रकार हैं।

लेकिन मैं तो डरावनी फिल्में पसंद ...

Person A -> [:wants_to_kill] -> Person B 

मैं इस रिश्ते की जरूरत है ताकि अगर मैं क्वेरी एक-दिशात्मक "कौन व्यक्ति क को मारने के लिए चाहता है?" मुझे व्यक्तिगत बी मिलती है, अगर मैं पूछता हूं "व्यक्ति बी कौन मारना चाहता है?" मुझे कुछ नहीं मिला।

कभी कभी मैं अभी भी रिश्ते की जरूरत है दो दिशात्मक

की तरह होने के लिए:

Person A <-[:has_met] -> Person B 

... जो स्पष्ट है।

प्रलेखन कहते हैं:

Relationships are equally well traversed in either direction. This means that there is 
no need to add duplicate relationships in the opposite direction (with regard to 
traversal or performance). 

While relationships always have a direction, you can ignore the direction where it is 
not useful in your application. 

तो डॉक्स कहते हैं, डिफ़ॉल्ट रूप से रिश्तों एक दिशा है और मैं अनदेखा कर सकते हैं अगर मैं चाहूं तो कि।

अब इस जगह है जहाँ चीजें जटिल हो:

निम्नलिखित ग्राफ पर विचार (और तीर ध्यान दें)

Person A <- [:wants_to_kill] -> Person B 
Person B -> [:wants_to_kill] -> Person C 
Person C -> [:wants_to_kill] -> Person A 

अगर मैं दिशा-निर्देश सभी [:wants_to_kill] के लिए मैं गलत परिणाम के लिए मिल उपेक्षा "कौन करता है व्यक्ति ए/सी मारना चाहता है? " अगर मुझे पता था कि मुझे किसको अनदेखा करना है, तो मैं क्वेरी नहीं करूँगा।

तो क्या मैं किसी भी तरह से दो दिशात्मक होने के संबंध स्थापित कर सकता हूं (उन्हें बनाते समय), या क्या मुझे इसे दो रिश्तों के साथ मॉडल करना चाहिए (व्यक्ति ए & बी के बीच)?

उत्तर

29

नियो 4j में एक रिश्ते हमेशा एक दिशा है। यदि रिश्ते के प्रकार के अर्थशास्त्र में कोई दिशा शामिल नहीं है, उदा। आपके उदाहरण से has_met, तो रिश्ते के निर्माण पर मनमाने ढंग से दिशा लागू करने का सबसे अच्छा अभ्यास है। क्वेरी फिर "दोनों दिशाओं" का उपयोग करके किया जाता है बीजलेख में संकेतन (कोई "बड़ा/की तुलना में छोटे" चरित्र है):

start ... match (a)-[:HAS_MET]-(b) .... 

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

start a=node:node_auto_index(name='A') match a-[:wants_to_kill]->victims_of_a return victims_of_a 

सभी व्यक्तियों को जो एक को मारने के लिए चाहते हैं खोजने के लिए::

Person A -[:wants_to_kill]-> Person B 
Person B -[:wants_to_kill]-> Person A 
Person B -[:wants_to_kill]-> Person C 
Person C -[:wants_to_kill]-> Person A 

सभी व्यक्ति है कि एक तुम क्या मारना चाहता है खोजने के लिए: ऊपर के उदाहरण के लिए, आप 4 रिश्तों की आवश्यकता है

start a=node:node_auto_index(name='A') match murderer_of_a-[:wants_to_kill]->a return murderer_of_a 
+0

स्पॉट पर, धन्यवाद! – joschua011

+3

दो साल बाद भी, यह अभी भी बेहद मूल्यवान है। दस्तावेज़ों में यह उत्तर नहीं मिला। यह बहुत अच्छी तरह से हो सकता है लेकिन शायद जिस तरह से उन्होंने इसे शब्द दिया, उसे ढूंढना मुश्किल हो गया। –