Gremlin用例-Int属性和coalesce()

时间:2018-07-17 07:12:04

标签: gremlin tinkerpop

  1. 存储为整数的顶点属性是否可以递增和递减?如果是这样,怎么办?

  2. 对于固定数据集,coalcece()是否总是返回相同的项目?是否可以将其随机化或以其他任何方式进行?例如,对于所有传入的顶点,即使数据集本身未更改,也应每次都选择一个随机顶点。

1 个答案:

答案 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()等来解决您的问题。