2011-09-24 9 views
18

मेरे पास एक ग्राफ डेटाबेस में मॉडलिंग के बारे में एक सामान्य सवाल है कि मैं अपने सिर को चारों ओर लपेटने के लिए प्रतीत नहीं कर सकता।ग्राफ डेटाबेस में रीयल-वर्ल्ड रिलेशनशिप मॉडल कैसे करें (जैसे Neo4j)?

आप इस प्रकार के रिश्ते को कैसे मॉडल करते हैं: "न्यूटन ने कैलकुस का आविष्कार किया"?

एक simple graph में, आप इसे इस तरह मॉडल सकता है:

Newton (node) -> invented (relationship) -> Calculus (node) 

... ताकि आप एक गुच्छा का ग्राफ रिश्तों 'आविष्कार' के रूप में आप और अधिक लोगों को और आविष्कार जोड़ा होगा।

समस्या यह है, आप रिश्ते के लिए गुण का एक समूह जोड़ने के लिए की आवश्यकता होगी, शुरू:

  • invention_date
  • influential_concepts
  • influential_people
  • books_inventor_wrote

... और आप उन गुणों और अन्य नोड्स के बीच रिश्तों को बनाना शुरू करना चाहते हैं, जैसे:

  • influential_people: व्यक्ति के लिए संबंध नोड
  • books_inventor_wrote: रिश्ते नोड्स बुक करने के लिए

तो अब यह "वास्तविक जीवन के संबंधों" की तरह लगता है ('आविष्कार') वास्तव में एक नोड होना चाहिए ग्राफ, और ग्राफ इस तरह दिखना चाहिए:

Newton (node) -> (relationship) -> Invention of Calculus (node) -> (relationship) -> Calculus (node) 

और जटिल चीजों को और अधिक, अन्य लोगों को भी पथरी के आविष्कार में भाग लिया जाता है, इसलिए ग्राफ अब हो जाता है कुछ की तरह:

Newton (node) -> 
    (relationship) -> 
    Newton's Calculus Invention (node) -> 
     (relationship) -> 
     Invention of Calculus (node) -> 
      (relationship) -> 
      Calculus (node) 
Leibniz (node) -> 
    (relationship) -> 
    Leibniz's Calculus Invention (node) -> 
     (relationship) -> 
     Invention of Calculus (node) -> 
      (relationship) -> 
      Calculus (node) 

तो मैं सवाल पूछ क्योंकि यह की तरह लगता है आप वास्तविक ग्राफ डेटाबेस पर गुण सेट नहीं करना चाहता "रिश्ते" कुछ पर वस्तुओं, क्योंकि आप चाहते हो सकता है बिंदु ग्राफ में नोड्स के रूप में उनका इलाज करें।

क्या यह सही है?

मैं Freebase Metaweb Architecture का अध्ययन कर रहा हूं, और वे सब कुछ नोड के रूप में व्यवहार कर रहे हैं। उदाहरण के लिए, फ्रीबेस में Mediator/CVT का विचार है, जहां आप "प्रदर्शन" नोड बना सकते हैं जो "अभिनेता" नोड को "फिल्म" नोड से लिंक करता है, जैसे: http://www.freebase.com/edit/topic/en/the_last_samurai। हालांकि यह बिल्कुल सही नहीं है कि यह एक ही मुद्दा है।

कुछ वास्तविक सिद्धांत क्या हैं जो आप यह समझने के लिए करते हैं कि क्या "असली दुनिया संबंध" वास्तव में ग्राफ संबंध के बजाय ग्राफ नोड होना चाहिए?

यदि इस विषय पर कोई अच्छी किताबें हैं तो मुझे जानना अच्छा लगेगा। धन्यवाद!

उत्तर

18

इनमें से कुछ चीजें, जैसे कि invention_date, किनारों पर गुणों के रूप में संग्रहीत किया जा सकता है क्योंकि अधिकांश ग्राफ डेटाबेस में किनारों में गुण हो सकते हैं जैसे कि कशेरुक गुण हो सकते हैं।उदाहरण के लिए आप (कोड TinkerPop's Blueprints इस प्रकार है) कुछ इस तरह कर सकता है: अब

Graph graph = new Neo4jGraph("/tmp/my_graph"); 
Vertex newton = graph.addVertex(null); 
newton.setProperty("given_name", "Isaac"); 
newton.setProperty("surname", "Newton"); 
newton.setProperty("birth_year", 1643); // use Gregorian dates... 
newton.setProperty("type", "PERSON"); 

Vertex calculus = graph.addVertex(null); 
calculus.setProperty("type", "KNOWLEDGE"); 

Edge newton_calculus = graph.addEdge(null, newton, calculus, "DISCOVERED"); 
newton_calculus.setProperty("year", 1666); 

, की सुविधा देता है यह एक छोटा सा विस्तार और Liebniz में जोड़ें:

Vertex principia = graph.addVertex(null); 
principia.setProperty("title", "Philosophiæ Naturalis Principia Mathematica"); 
principia.setProperty("year_first_published", 1687); 
Edge newton_principia = graph.addEdge(null, newton, principia, "AUTHOR"); 
Edge principia_calculus = graph.addEdge(null, principia, calculus, "SUBJECT"); 
: किताबों में जोड़ा जा रहा है

Vertex liebniz = graph.addVertex(null); 
liebniz.setProperty("given_name", "Gottfried"); 
liebniz.setProperty("surnam", "Liebniz"); 
liebniz.setProperty("birth_year", "1646"); 
liebniz.setProperty("type", "PERSON"); 

Edge liebniz_calculus = graph.addEdge(null, liebniz, calculus, "DISCOVERED"); 
liebniz_calculus.setProperty("year", 1674); 

न्यूटन ने उन सभी पुस्तकों को जानने के लिए जिन पर उन्होंने पाया कि हम एक ग्राफ ट्रैवर्सल बना सकते हैं। हम न्यूटन के साथ शुरू करते हैं, उन चीज़ों के बारे में उनके द्वारा दिए गए लिंक का पालन करें, फिर उस विषय पर किताबें प्राप्त करने के लिए विपरीत लिंक को लिंक करें और फिर लेखक को प्राप्त करने के लिए एक लिंक पर विपरीत जाएं। अगर लेखक न्यूटन है तो पुस्तक पर वापस जाएं और परिणाम वापस कर दें। इस क्वेरी Gremlin में लिखा है, ग्राफ traversals के लिए एक ग्रूवी आधारित डोमेन विशिष्ट भाषा:

newton.out("DISCOVERED").in("SUBJECT").as("book").in("AUTHOR").filter{it == newton}.back("book").title.unique() 

इस प्रकार, मुझे आशा है कि मैं एक छोटे से कैसे एक चतुर ट्रेवर्सल मध्यवर्ती नोड्स बनाने का प्रतिनिधित्व करने के साथ मुद्दों से बचने के लिए इस्तेमाल किया जा सकता दिखाया है किनारों। एक छोटे से डेटाबेस में इससे कोई फर्क नहीं पड़ता, लेकिन एक बड़े डेटाबेस में आपको बड़ी प्रदर्शन हिट करने का सामना करना पड़ेगा।

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

+0

उत्कृष्ट उत्तर! यह वास्तव में मेरे लिए चीजों को साफ़ करता है, धन्यवाद। –

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