Gremlin 用例 - Int 属性和 coalesce()
Gremlin use case - Int properties and coalesce()
存储为整数的顶点属性可以递增和递减吗?如果可以,怎么做?
对于一个固定的数据集,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()
等来解决你的问题。
存储为整数的顶点属性可以递增和递减吗?如果可以,怎么做?
对于一个固定的数据集,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())
.
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()
等来解决你的问题。