示例图:
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。在遍历中使用属性作为总和比较的正确方法是什么?
答案 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()
。