के साथ एक आदेशित पेड़ को मॉडलिंग करना मैं केवल neo4j के साथ शुरू कर रहा हूं, और मैं ग्राफ और रिश्तों के सिद्धांतों को समझता हूं, लेकिन मुझे कुछ संरचनाओं के साथ कुछ परेशानी हो रही है, जिन्हें मैं मॉडल बनाना चाहता हूं। मैं इसे प्रोग्रामिंग भाषा प्रोजेक्ट पर उपयोग करना चाहता था, और एक पार्सड स्रोत फ़ाइल के एएसटी को स्टोर करना चाहता था। वहां से, मैं विश्लेषण और टूलिंग में सहायता के लिए नोड्स के लिए बहुत से अतिरिक्त डेटा और संबंध जोड़ने की योजना बना रहा हूं, लेकिन मौलिक एएसटी अभी भी थोड़ा मुश्किल है।neo4j
पेड़ बनाने का बेवकूफ तरीका बस एएसटी चलना होगा और टर्न में प्रत्येक नोड को नीओ 4j में नोड में कॉपी करना होगा, टोकन डेटा का ट्रैक रखने के लिए गुणों का उपयोग करना होगा और फिर बिंदु के साथ एक चिल्ड्रन रिलेशनशिप का उपयोग करना होगा बच्चे नोड्स के लिए। समस्या यह है कि जब मैं बाद में पेड़ पार करने के लिए चाहते हैं, तो मैं मूल AST के सही क्रम में यह करने के लिए सक्षम होना चाहिए है, लेकिन बॉक्स से बाहर मैं काफी है कि ऐसा करने के लिए सबसे अच्छा तरीका है यकीन नहीं है।
मैं दो बुनियादी दृष्टिकोण मैं अपने सिर के ऊपर से सोच रहा हूँ है। एक सिर्फ प्रत्येक बच्चे संबंध में एक सूचकांक/औपचारिक संपत्ति जोड़ना है। दूसरी बात यह है कि पहले बच्चे के साथ पहला रिश्ता और प्रत्येक बच्चे के बीच एक नया संबंध इस तरह से बनाए रखने के लिए है।
इनमें से किसी भी दृष्टिकोण के लिए यह अभी भी ऐसा लगता है कि बॉक्स के बाहर कुछ भी नहीं है जिसका उपयोग मैं सही क्रम में पार करने के लिए कर सकता हूं। मुझे लगता है कि अगर मैं FIRST/NEXT करता हूं, तो मैं सही ऑर्डर प्राप्त कर सकता हूं जब तक कि मैं neo4j को हमेशा पहले ट्रैवर्स करने के लिए मजबूर करता हूं और पहली बार गहराई से खोज करता हूं। क्या इससे काम हो जायेगा? क्या कोई बेहतर तरीका है? यह ऐसा कुछ लगता है जिसे बॉक्स से बाहर संभाला जाना चाहिए।
अद्यतन
अंत में मैं अपने विचारों से दोनों का उपयोग करने का फैसला किया। बाल नोड्स में इंडेक्स प्रॉपर्टी के साथ एक चिल्ड्रन रिलेशनशिप है। पहले बच्चे के पास FIRST_CHILD संबंध भी है। सही क्रम देने के लिए भाई नोड्स में NEXT_SIBLING संबंध है। उसके बाद, ट्रेवर्सल आसान था:
//reusable traversal description
final private TraversalDescription AST_TRAVERSAL = Traversal.description()
.depthFirst()
.expand(new OrderedByTypeExpander()
.add(RelType.FIRST_CHILD, Direction.OUTGOING)
.add(RelType.NEXT_SIBLING, Direction.OUTGOING));
और फिर जब मैं वास्तव में पेड़ चलने के लिए की जरूरत है मैं सिर्फ कर सकता है
for(Path path : AST_TRAVERSAL.traverse(astRoot)){
//do stuff here
}
मेरी उपयोग के मामले के लिए, मैं वास्तव में वृक्ष संरचना को संशोधित नहीं सृजन के बाद ही - मैं सिर्फ विश्लेषण करता हूं और अधिक रिश्ते और गुण जोड़ता हूं, इसलिए इसे बनाए रखना आसान है। अगर मुझे और संशोधन करना पड़ा, तो यह थोड़ा सा काम हो सकता है, खासकर अगर मैं बाल संबंधों पर सूचकांक संख्या को बनाए रखना चाहता हूं। तो यह एक समान स्थिति में किसी और के लिए विचार करने के लिए कुछ हो सकता है।
अगर मैं कुछ और अधिक परिवर्तनीय हो गया, तो संभवतः मैं पीटर न्यूबॉयर के संग्रहों का प्रयास करने की कोशिश करता हूं, और संभवतः एक नोड को इंगित करने और बच्चों के लिए सूची संग्रह का उपयोग करके ऑर्डर्ड ट्रीनोड क्लास बनाना होगा।
धन्यवाद, मैं देख रहा हूं और मुझे लगता है कि मैं कुछ बिंदुओं पर कुछ चीजों का उपयोग कर सकता हूं। अभी के लिए, क्योंकि मैं सृजन के बाद नोड्स में बहुत कुछ संशोधन नहीं करता, मुझे लगता है कि मैं FIRST/NEXT के साथ रहना चाहता हूं, लेकिन अगर मुझे और जटिल आवश्यकताएं मिलती हैं, तो मुझे निश्चित रूप से इसे आज़मा देना होगा । थोड़ा और दस्तावेज उपयोगी होगा, लेकिन मैं इसे एक काम प्रगति पर समझता हूं और यह बहुत अच्छा लगता है, धन्यवाद। –