2015-09-18 16 views
9

मेरे पास कई स्तरों वाला पेड़ है, जहां पत्ते के नोड्स में संपत्ति "गिनती" हो सकती है। मैं प्रत्येक उप-पेड़ के लिए कुल गणना की गणना करना चाहता हूं, और उन मानों को प्रत्येक उप-पेड़ के रूट नोड में कैश करना चाहता हूं। क्या यह Gremlin में संभव है?Gremlin में उप-पेड़ों के लिए कुल गणना कैसे करें?

+0

जो दुष्टात्मा 2.x या 3.x के संस्करण: आप पेड़ पार की गणना करने के बाद c तुम सिर्फ माध्यम सबट्री के अपने रूट नोड में c का मूल्य स्टोर कर सकते हैं? –

+0

Gremlin 2.x बेहतर होगा। – isobretatel

उत्तर

3

आप इसे sideEffect के साथ कर सकते हैं - यह बहुत सरल है। हम सेटअप के साथ एक सरल पेड़:

gremlin> g.V().filter{it.outE().hasNext()}.sideEffect{           
gremlin> c=0;                     
gremlin> it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate() 
gremlin> it.setProperty('total',c)                  
gremlin> }                         
==>v[0] 
==>v[1] 
gremlin> g.v(0).total 
==>5 
gremlin> g.v(1).total                      
==>3 

कि क्वेरी इस तरह टूट जाती है:

gremlin> g = new TinkerGraph()                 
==>tinkergraph[vertices:0 edges:0] 
gremlin> v1 = g.addVertex()                  
==>v[0] 
gremlin> v2 = g.addVertex()                  
==>v[1] 
gremlin> v3 = g.addVertex([count:2])               
==>v[2] 
gremlin> v4 = g.addVertex([count:3])               
==>v[3] 
gremlin> v1.addEdge('child',v2)                 
==>e[4][0-child->1] 
gremlin> v1.addEdge('child',v3)                 
==>e[5][0-child->2] 
gremli                       
gremlin> v2.addEdge('child',v4) 
==>e[6][1-child->3] 

और फिर यहाँ पूर्ण पेड़ के भीतर प्रत्येक सबट्री से अधिक गणना है। सबसे पहले, इस टुकड़े:

g.V().filter{it.outE().hasNext()} 

पेड़ है कि एक पत्ती नोड नहीं है के किसी भी भाग हो जाता है (अर्थात कम से कम एक निवर्तमान बढ़त हासिल है एक पत्ता नहीं होने के लिए चाहिए)। दूसरा, हम एक सबट्री से प्रत्येक जड़ पर कार्रवाई करने के sideEffect का उपयोग करें:

it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate() 

एक चर c कहा जाता है में एक सबट्री के लिए "गिनती" संपत्ति की राशि के संचय। "गिनती" संपत्ति के बिना शिखर की जांच करने और उन मामलों में शून्य लौटने के लिए एल्विस ऑपरेटर (?:) के साथ वहां कुछ गड़बड़ी की भलाई है।

it.setProperty('total',c) 
+0

>> आप बस subtree के अपने रूट नोड में सी के मान को स्टोर कर सकते हैं << कैसे? – isobretatel

+0

'v1.setProperty ('कुल', सी)' - क्या आपको कुछ और चाहिए? –

+0

हां: पूरे पेड़ के लिए नहीं, _each_ उप-पेड़ के लिए उन मानों की गणना और कैश करें। – isobretatel

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