1

グラフは以下です。

gremlin> a = graph.addVertex("name", "alice")
gremlin> b = graph.addVertex("name", "bobby")
gremlin> c = graph.addVertex("name", "cindy")
gremlin> d = graph.addVertex("name", "david")
gremlin> e = graph.addVertex("name", "eliza")
gremlin> a.addEdge("rates",b,"tag","ruby","value",9)
gremlin> b.addEdge("rates",c,"tag","ruby","value",8)
gremlin> c.addEdge("rates",d,"tag","ruby","value",7)
gremlin> d.addEdge("rates",e,"tag","ruby","value",6)
gremlin> e.addEdge("rates",a,"tag","java","value",10)

以下に3つのスクリプトがあります。

スクリプト #1

gremlin> g.V().has('name','alice').
           repeat(out()).
             until(has('name','alice')).
           cyclicPath().
           path().by('name')`
==>[alice,bobby,cindy,david,eliza,alice]

スクリプト #2

gremlin> g.V().has('name','alice').
           repeat(outE().inV()).
             until(has('name','alice')).
           cyclicPath().
           group().
             by('name').
             by(path().unfold().has('value').values('value').fold()).
           next()
==>alice=[9, 8, 7, 6, 10]

スクリプト #3

gremlin> g.V().has('name','alice').
           repeat(outE().inV()).
             until(has('name','alice')).
           cyclicPath().
           group().
             by('name').
             by(path().unfold().has('value').values('value').fold()).
           next().collect { k, v ->
             k + '=' + v.withIndex().collect { Integer it, Integer idx ->
                 return it * (1/(idx + 1))
             }.inject(0.0) { acc,i -> acc + i }
           }
==>alice=18.8333333331

私の質問は、以下にリストされている結果をどのように取得できますか? 3つを組み合わせるだけ

alice=[alice,bobby,cindy,david,eliza,alice]=[9, 8, 7, 6, 10]=18.8333333331
4

2 に答える 2

5

Davidが提案したように、3つのクエリを実行してから結果をマージする方が、おそらくはるかに簡単であるか、少なくとも保守性が高くなります。ただし、単一のクエリですべてを実行する場合は、次のことができます。

g.V().has('name','alice').as('v').
  repeat(outE().as('e').inV().as('v')).
    until(has('name','alice')).
  store('a').
    by('name').
  store('a').
    by(select(all, 'v').unfold().values('name').fold()).
  store('a').
    by(select(all, 'e').unfold().
       store('x').
         by(union(values('value'),
                  select('x').count(local)).fold()).
       cap('x').
       store('a').
         by(unfold().limit(local, 1).fold()).unfold().
       sack(assign).
         by(constant(1d)).
       sack(div).
         by(union(constant(1d),
                  tail(local, 1)).sum()).
       sack(mult).
         by(limit(local, 1)).
       sack().sum()).
  cap('a')

サンプル グラフの使用:

gremlin> g.V().has('name','alice').as('v').
......1>   repeat(outE().as('e').inV().as('v')).
......2>     until(has('name','alice')).
......3>   store('a').
......4>     by('name').
......5>   store('a').
......6>     by(select(all, 'v').unfold().values('name').fold()).
......7>   store('a').
......8>     by(select(all, 'e').unfold().
......9>        store('x').
.....10>          by(union(values('value'),
.....11>                   select('x').count(local)).fold()).
.....12>        cap('x').
.....13>        store('a').
.....14>          by(unfold().limit(local, 1).fold()).unfold().
.....15>        sack(assign).
.....16>          by(constant(1d)).
.....17>        sack(div).
.....18>          by(union(constant(1d),
.....19>                   tail(local, 1)).sum()).
.....20>        sack(mult).
.....21>          by(limit(local, 1)).
.....22>        sack().sum()).
.....23>   cap('a')
==>[alice,[alice,bobby,cindy,david,eliza,alice],[9,8,7,6,10],18.833333333333332]

特に同じパスを何度もトラバースする必要がないため、単一のクエリですべてを実行するといくつかの利点がありますが、そのような複雑なクエリを維持するのは困難です。完全なパスを返すだけで、期待される結果をクライアント側で構築する方がおそらく良いでしょう。

于 2017-12-06T17:21:56.947 に答える