Yaprak düğümlerinin "sayım" özelliği taşıyabileceği birçok düzeydeki bir ağacım var. Her alt ağaç için toplam sayımı hesaplamak ve her alt ağacın kök düğümündeki bu değerleri önbelleğe almak istiyorum. Gremlin'de bu mümkün mü?Gremlin'de alt ağaçların agregatları nasıl hesaplanır?
cevap
sideEffect
ile yapabilirdiniz - bu oldukça basittir. Biz kurulum ile basit ağacı:
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
Yani sorgu şu şekilde ayırır: Burada daha sonra
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]
Ve tam ağacın içindeki her alt ağaç üzerinde hesaplama verilmiştir. İlk olarak, bu parça:
g.V().filter{it.outE().hasNext()}
bir yaprak düğümü değildir ağaç herhangi bir bölümünü alır (yani, bir yaprak vermeye için en az bir giden kenar olmalıdır). İkincisi, bir alt ağacının her kök işlemek için sideEffect
kullanın:
it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate()
c
adında bir değişkende her alt ağacı için "saymak" özelliğinin toplamını depolamak. Orada bir "sayım" özelliği olmadan köşeleri kontrol etmek ve bu durumlarda bir sıfır döndürmek için elvis operatörü (?:
) ile biraz groovy iyilik var. Gremlin 2.x veya 3.x
it.setProperty('total',c)
>> c'nin değerini alt ağacın kök düğümünde saklayabilirsiniz << Nasıl? – isobretatel
' v1.setProperty ('total', c) '- daha fazlasına ihtiyacınız var mı? –
Evet: tüm ağaç için değil, _each_ alt ağacı için bu değerleri hesaplayın ve önbelleğe alın. – isobretatel
hangi sürümü: Hesaplamak ağaç travers sonra
c
sadece aracılığıyla altağacın kök düğümündec
değerini saklayabilir? –Gremlin 2.x tercih edilebilir. – isobretatel