Neo4J

2015-01-07 15 views
5

मैं Neo4J में एक परिवार के पेड़ के लिए डेटा का एक सेट है और एक साइफर क्वेरी कि एक JSON डेटा के लिए निम्न समान सेट का उत्पादन का निर्माण करने की कोशिश कर रहा हूँ के साथ परिवार ट्री बनाना: एकNeo4J

{Name: "Bob", 
     parents: [ 
      {Name: "Roger", 
      parents: [ 
       Name: "Robert", 
       Name: "Jessica" 
      ]}, 
      {Name: "Susan", 
      parents: [ 
       Name: "George", 
       Name: "Susan" 
      ]} 
     ]} 

मेरे ग्राफ है सदस्य नोड्स के बीच माता-पिता के संबंध (यानी MATCH (पी। मेम्बर) - [: माता-पिता] -> (सी। मेम्बर))। मुझे Nested has_many relationships in cypher और neo4j cypher nested collect मिला जो मुख्य माता-पिता के लिए सभी माता-पिता को एकसाथ समूहित करने के लिए समाप्त होता है।

प्रतिक्रिया के आधार पर कुछ स्पष्टता जोड़ना:

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

कोई नमूना क्वेरी जोड़ना:

MATCH (p:Person)-[:PARENT*1..5]->(c:Person) 
WHERE c.FirstName = 'Bob' 
RETURN p.FirstName, c.FirstName 

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

+0

अधिक जानकारी के लिए मत भूलना कृपया; क्या आप आरईएसटी एपीआई या एम्बेडेड डीबी का उपयोग कर रहे हैं? यदि आप आरईएसटी एपीआई का उपयोग कर रहे हैं, तो आपकी समस्या जेएसओएन को बदलने के काम को सरलीकृत कर सकती है, जो कि आरएसटी एपीआई बाहर निकलती है, इस ढांचे में आप जिसकी तलाश कर रहे हैं। http://neo4j.com/docs/stable/rest-api.html – FrobberOfBits

उत्तर

4

तुम भी एक नज़र हो सकता है Rik van Bruggens Blog on his family data पर:

MATCH ft = (person {firstName: 'Bob'})<-[:PARENT]-(p:Person) 
RETURN EXTRACT(n in nodes(ft) | {firstName: n.firstName}) as parentage 
ORDER BY length(ft); 

कौन सा एक डाटासेट वापस आ जाएगी मैं तो रूप करने के लिए कर रहा हूँ:

आपकी क्वेरी के बारे में

आप पहले से ही यहां एक रास्ता पैटर्न बनाने के लिए: (p:Person)-[:PARENT*1..5]->(c:Person) आप एक चर tree को असाइन कर सकें और फिर उस चर, उदा पर कार्य करते हैं पेड़ लौटने, या nodes(tree) या rels(tree) या अन्य तरीकों से उस संग्रह पर कार्य करते हैं:

MATCH tree = (p:Person)-[:PARENT*1..5]->(c:Person) 
WHERE c.FirstName = 'Bob' 
RETURN nodes(tree), rels(tree), tree, length(tree), 
     [n in nodes(tree) | n.FirstName] as names 

भी देखें बीजलेख संदर्भ कार्ड: http://neo4j.com/docs/stable/cypher-refcard और ऑनलाइन प्रशिक्षण http://neo4j.com/online-training साइफर के बारे में अधिक जानने के लिए।

create index on :Person(FirstName); 
2

मैं आपके डेटा को सरणी में फ़्लैट करने के लिए एक विधि बनाने का सुझाव दूंगा। यदि उनके पास ऑब्जेक्ट्स नहीं हैं तो यूयूआईडी नहीं है, तो संभवतः आप उन्हें आईडी देना चाहते हैं जैसे आप फ़्लैट करते हैं और फिर प्रत्येक रिकॉर्ड के लिए parent_id कुंजी रखते हैं।

फिर आप बीजलेख क्वेरी के एक सेट के रूप में चला सकते हैं (या तो क्वेरी REST API करने के लिए कई अनुरोध करने, या बैच बाकी एपीआई का उपयोग कर) या वैकल्पिक रूप से सीएसवी करने के लिए डेटा डंप और वस्तुओं को लोड करने बीजलेख के LOAD CSV आदेश का उपयोग करें।

पैरामीटर वाला एक उदाहरण बीजलेख कमांड यह होगी:

CREATE (:Member {uuid: {uuid}, name: {name}} 

और फिर माता-पिता और बच्चे ID के साथ फिर से सूची के माध्यम से चल रहा है:

MATCH (m1:Member {uuid: {uuid1}}), (m2:Member {uuid: {uuid2}}) 
CREATE m1<-[:PARENT]-m2 

आईडी पर एक सूचकांक के लिए सुनिश्चित करें सदस्यों के लिए!

+0

यह जो मैं ढूंढ रहा हूं उसके करीब है। क्या एक क्वेरी के माध्यम से सेट उत्पन्न करने का कोई तरीका नहीं है? कहो कि मैं किसी दिए गए व्यक्ति से चार या पांच पीढ़ियों के लिए पेड़ देखना चाहता हूं। मैं डेटा दिखाने के लिए ग्राफ प्राप्त कर सकता हूं - यदि संभव हो तो मुझे साइफर के माध्यम से इसे मोर्फ़ करने का एक तरीका चाहिए। अन्यथा, मुझे मूल क्वेरी से लौटने वाले कच्चे डेटा के साथ रहना होगा और इसे उस प्रारूप में संसाधित करना होगा जिसे मैं ढूंढ रहा हूं। – OpenDataAlex

+0

इसे केवल साइफर का उपयोग करना संभव हो सकता है, लेकिन मुझे संदेह है कि यह प्रयास के लायक नहीं होगा। –

+0

ओह, क्षमा करें, मैं गलत पढ़ता हूं। मैंने सोचा था कि आप जेएसओएन लेना चाहते हैं और इसे साइफर के साथ एक neo4j डेटाबेस में बदलना चाहते हैं, लेकिन आप –

2

वंशावली डेटा GEDCOM मानक का अनुपालन कर सकता है और इसमें दो प्रकार के नोड शामिल हैं: व्यक्ति और संघ। व्यक्ति नोड के पहचानकर्ता और सामान्य जनसांख्यिकीय तथ्यों हैं। यूनियन नोड्स में यूनियन_आईडी और संघ के बारे में तथ्य हैं। GEDCOM में, परिवार इन दोनों को एक साथ लाने वाला तीसरा तत्व है। लेकिन नियो 4j में, मैंने इसे व्यक्तिगत नोड्स में union_id भी शामिल करने के लिए उपयुक्त पाया। मैंने 5 रिश्तों का इस्तेमाल किया: पिता, मां, पति, पत्नी और बच्चे। परिवार तब दो माता-पिता होता है जिसमें एक आंतरिक वेक्टर होता है और प्रत्येक बच्चा बाहरी वेक्टर होता है। छवि इसे दिखाती है। यह कनेक्शन को देखने और परिकल्पना पैदा करने के लिए बहुत आसान है। उदाहरण के लिए, संलग्न तस्वीर और मेरे पूर्वजों एडवर्ड जी कैंपबेल, 1 9 17 के संघ के उत्पाद पर विचार करें जहां तीन भाइयों ने यूनियन 8944 से तीन व्यंग्य बहनों से विवाह किया और दो ने 2 9 45 के साथ गैथर बहनों से विवाह किया। इसके अलावा, ऊपरी बाईं ओर, महाला कैंपबेल ने उससे शादी कैसे की सौतेले भाई जॉन गियर आर्मस्ट्रांग। महाला के बगल में एक एलिजाबेथ कैंपबेल है जो विवाह से अन्य कैंपबेल से जुड़ा हुआ है, लेकिन संभवतः उनसे संबंधित है। इसी प्रकार, आप ऊपरी दाएं भाग में राचाल जैकब्स के बारे में कल्पना कर सकते हैं और वह अन्य जैकब्स से कैसे संबंधित हो सकती है। Notice the query. From the few initial nodes visualized, you can click to open others. मैं थोक आवेषण का उपयोग करता हूं जो ~ 30000 व्यक्ति नोड्स और ~ 100,000 रिश्तों को सिर्फ एक मिनट में पॉप्युलेट कर सकता है।मेरे पास एक छोटा .NET फ़ंक्शन है जो JSON को डेटाव्यू से लौटाता है; यह जेनेरिक समाधान किसी भी डाटाव्यू के साथ काम करता है, इसलिए यह स्केलेबल है। अब मैं अन्य डेटा जोड़ने जैसे काम कर रहा हूं, जैसे स्थानों (लेट/लांग), दस्तावेज़ीकरण (विशेष रूप से जो लोग जनगणना जैसे लोगों को जोड़ते हैं), आदि

0

डेटा प्राप्त करने के लिए मुझे एकमात्र तरीका मिला है मैं देख रहा हूँ वास्तव में रिश्ते जानकारी लौटाने के लिए है, इसलिए की तरह है:

["Bob", "Roger"] 
["Bob", "Susan"] 
["Bob", "Roger", "Robert"] 
["Bob", "Susan", "George"] 
["Bob", "Roger", "Jessica"] 
["Bob", "Susan", "Susan"] 
+0

के आसपास दूसरी तरफ चाहते हैं, मैंने माइकल लिख रहे थे, जबकि मैंने यह जवाब लिखा था :) दोनों एक ही ट्रैक पर हैं, इसलिए उन्हें हल किया गया जवाब दिया। – OpenDataAlex