存储为整数的顶点属性是否可以递增和递减?如果是这样,怎么办?
对于固定数据集,coalcece()是否总是返回相同的项目?是否可以将其随机化或以其他任何方式进行?例如,对于所有传入的顶点,即使数据集本身未更改,也应每次都选择一个随机顶点。
答案 0 :(得分:2)
存储为整数的顶点属性是否可以递增和递减?
您可以使用sack()
:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().property('counter',0).iterate()
gremlin> g.V().
......1> sack(assign).
......2> by('counter').
......3> sack(sum).
......4> by(constant(1)).
......5> property('counter', sack()).
......6> valueMap()
==>[name:[marko],counter:[1],age:[29]]
==>[name:[vadas],counter:[1],age:[27]]
==>[name:[lop],counter:[1],lang:[java]]
==>[name:[josh],counter:[1],age:[32]]
==>[name:[ripple],counter:[1],lang:[java]]
==>[name:[peter],counter:[1],age:[35]]
gremlin> g.V().
......1> sack(assign).
......2> by('counter').
......3> sack(sum).
......4> by(constant(1)).
......5> property('counter', sack()).
......6> valueMap()
==>[name:[marko],counter:[2],age:[29]]
==>[name:[vadas],counter:[2],age:[27]]
==>[name:[lop],counter:[2],lang:[java]]
==>[name:[josh],counter:[2],age:[32]]
==>[name:[ripple],counter:[2],lang:[java]]
==>[name:[peter],counter:[2],age:[35]]
既然您已经在上面的操作中看到了遍历,让我们更仔细地看一下遍历:
g.V().
sack(assign).
by('counter').
sack(sum).
by(constant(1)).
property('counter', sack()).
valueMap()
因此,对于每个顶点,您都使用assign
在其“袋”中放置一个值-by('counter')
调制器将该赋值定义为“ counter”属性的值(该属性先前已初始化为零)在我的示例中)。然后,使用sack(sum)
,我们定义如何将计数器by(constant(1))
或“加1”递增(即,将麻袋中的值与1相加并将其存储在麻袋中)。最后,我们将值从袋子中取出,并用property('counter', sack())
用新值覆盖原始的“ counter”属性。
对于固定数据集,coalcece()是否总是返回相同的项目?
与“元素顺序”有关的大多数问题都必须推迟到基础图形系统中进行。如果您的图形数据库按确定的顺序返回元素,那么您的Gremlin应该会。如果您需要确定订单并具有完全可移植的查询,则应在Gremlin中包括使用order()
步骤。
我相信合并将始终伴随第一个遍历一起返回值,所以在:
g.V().coalesce(outE(), inE())
如果当前顶点具有输出边,您将始终获得outE()
的结果。要获得随机选择,您可以执行以下操作:
g.V().coalesce(outE().fold().coin(0.5), inE().fold()).unfold()
那有点用...换句话说,对于outE()
返回某物的情况,有50%的时间它什么也不返回,因此允许inE()
选项起作用。我不确定您到底要做什么,但是也许您可以摆脱方程式中的coalesce()
,而只需使用简单的coin()
,sample()
等来解决您的问题。