【问题标题】:Repeat in gremlin在 gremlin 中重复
【发布时间】:2020-09-08 08:11:43
【问题描述】:

gremlin相关的两个查询如下:

  1. 希望在重复条件检查期间满足条件时停止遍历。
g.V().has('label_','A')).emit().repeat(inE().outV()).until(has('stop',1)).project('depth','values').by(valueMap('label_','stop'))

我希望查询在重复语句期间遇到的节点的停止等于 1 时停止返回更多值。但查询不会停止并返回所有记录。 需要输出:

=>{label_='A',stop=0}
=>{label_='B',stop=0}
=>{label_='C',stop=1}
  1. 查询以下列格式返回遍历值,考虑它们之间是否存在边。将图形视为 A->E1->B->E2->C。输出必须如下
=> A,E1,B
=> B,E2,C

A、B、C、E1、E2分别代表属性,起始节点在哪里

【问题讨论】:

  • 能否提供一个图表示例?您可以在 gremlify.com 中创建一个或添加一个生成一些数据的 gremlin 脚本。
  • g.addV().property('label_','A').property('stop',0).addV().property('label_','B').property ('stop',0).addV().property('label_','C').property('stop',1) 类似于 A 到 B 和 B 到 C 之间的边

标签: graph gremlin janusgraph


【解决方案1】:

对于第一部分,您似乎是在边缘而不是在边缘遍历,这是故意的吗?如果是这样,请将重复中的out() 替换为in

g.V().has(label, 'A').emit().
  repeat(out()).until(has('stop', 1)).
  project('label', 'stop').
    by(label).
    by(values('stop'))

示例:https://gremlify.com/ma2xkkszkzr/1

对于第二部分,我仍然不确定你的意思是什么,如果你只是想获得所有优势,你可以使用elementMap

g.E().elementMap()

示例:https://gremlify.com/ma2xkkszkzr/4

如果不支持,您可以执行以下操作:

g.E().local(union(
      outV(),
      identity(),
      inV()
    ).label().fold())

示例:https://gremlify.com/ma2xkkszkzr/2

【讨论】:

  • 对于第一部分,我需要将边缘属性返回到但未提及,因为它会很复杂。边缘是否会导致问题,直到无法解决?对于第二部分,所需的格式是节点 -> 边缘 -> 节点。即 A->E1->B ,这将从 A 开始并继续使用重复直到边缘存在。
  • 厌倦了第一种方法的解决方案,直到仍然无法正常工作。重复条件如下:repeat(inE().outV())
  • @Phoenix 在第一个示例中,如果您从 A 开始,则方向不正确。你需要运行outE().inV()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多