带有属性和遍历总和的gremlin where子句

时间:2018-09-27 03:28:11

标签: azure-cosmosdb gremlin

示例图:

g.addV('location').property('name','Location A').as('location')
.addV('building').property('totalLetterCapacity',50).as('building')
.sideEffect(addE('has-building').from('location'))
.addV('letter').property('totalLetters',10).as('a')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('b')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('c')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('d')
.sideEffect(addE('has-letter').from('building'))
.addV('letter').property('totalLetters',10).as('e')
.sideEffect(addE('has-letter').from('building'))

在此示例图中,我想获取所有装有字母的建筑物。因此,在此示例图中,只有一个位置可以满足要求:建筑物的总字母容量为50个,建筑物的10个容量为5个字母。

我希望这样的事情可以工作:

g.V().hasLabel('location')
 .out('has-building')
 .where(values('totalLetterCapacity')
       .is(eq(out('has-letter').values('totalLetters').sum())

,但是似乎eq谓词或任何谓词(lte,lt,gte)不允许遍历。我尝试执行某种double where子句-在where中的where,但是最终变得有点疯狂。

我正在使用天蓝色的宇宙db gremlin。在遍历中使用属性作为总和比较的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

P.eq()是对相等性的检验,所以类似这样:

values('totalLetterCapacity').is(eq(out('has-letter').values('totalLetters').sum())

表示您想将“ totalLetterCapacity”中的数值与一个明显为Traversal的匿名Traversal(不是该false的结果)进行比较。

立即解决这个问题的方法就是这样做:

gremlin> g.V().hasLabel('location').
......1>   out('has-building').as('a').
......2>   where('a', eq('a')).
......3>     by('totalLetterCapacity').
......4>     by(out('has-letter').values('totalLetters').sum())
==>v[2]

以上,where()将标记为“ a”的顶点与标记为“ a”的顶点用P.eq()进行比较,但是在该比较中分配的值由提供的by()调制器确定。第一个“ a”是“ totalLetterCapacity”,第二个“ a”是“ letter”顶点上“ totalLetters”的sum()