Gremlin 用例 - Int 属性和 coalesce()

Gremlin use case - Int properties and coalesce()

  1. 存储为整数的顶点属性可以递增和递减吗?如果可以,怎么做?

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

Can vertex properties stored as integers be incremented and decremented?

您可以使用 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()

因此,对于每个顶点,您在其 "sack" 中放置一个值 assign - by('counter') 调制器将该赋值定义为 "counter" 属性(在我的示例中早些时候已初始化为零)。然后使用 sack(sum) 我们定义我们如何增加计数器 by(constant(1)) 或 "by 1" (即取 sack 中的值并将其与 1 相加并将该值存储在 sack 中)。最后我们从 sack 中取出值并用 property('counter', sack()).

的新值覆盖原来的 "counter" 属性

For a fixed dataset, does coalesce() always return the same item?

大多数与 "element order" 有关的问题必须推迟到底层图形系统。如果您的图形数据库 returns 元素具有确定性顺序,那么您的 Gremlin 应该。如果您需要确定订单并有一个完全可移植的查询,那么您应该在 Gremlin 中使用 order() 步骤。

我相信 coalesce 总是会伴随第一次遍历到 return 一个值,所以在:

g.V().coalesce(outE(), inE())

如果当前顶点有出边,您将始终得到 outE() 的结果。要随机选择,也许你可以这样做:

g.V().coalesce(outE().fold().coin(0.5), inE().fold()).unfold()

有点管用...换句话说,对于 outE() return 的情况,50% 的时间它 return 什么都不会,因此允许 inE()选项工作。我不确定你究竟在追求什么,但也许你可以从等式中得到 coalesce(),只需使用简单的 coin()sample() 等来解决你的问题。