Gremlin:使用身份获取联合的空结果

Gremlin: getting empty result for union using identity

我正在执行以下查询,其中 returns 一个空列表:

g
  .V("user-11")
  .outE("validate_phone")
  .union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))    
  .toList()

这很奇怪,因为 phone-29e78c7c18a8bb33c608dbc233bc155e 是图中的有效节点。

试图找出问题我意识到节点 user-11 没有边缘 validate_phone 这似乎会导致问题,我尝试使用另一个节点 identity()函数将导致非空列表,并发现在这种情况下返回 v[phone-29e78c7c18a8bb33c608dbc233bc155e]

换句话说

g.V("user-11").outE("validate_phone").toList() // returns an empty list
g.V("user-347883719").outE("validate_phone").toList() // returns a non empty list

g.V("user-347883719").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e")).toList() // works just fine
g.V("user-11").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e")).toList() // should return at least one vertex, but doesn't
  

我的第一个想法是,在合并空查询结果时,ether unionidentity 的行为不如预期,但我可能遗漏了一些东西。

如有任何帮助,我们将不胜感激!

如果你想象 Gremlins 执行你的遍历步骤,它会有所帮助。

这就是为什么以下遍历没有 return 任何结果的原因。

g.V("user-11").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))

g.V("user-11") 在 v[user-11]
上放置一个 Gremlin outE("validate_phone") 要求这个 Gremlin 移动到传出的“validate_phone”边缘。并且由于当前顶点没有传出的“validate_phone”边,Gremlin 无法执行该步骤并死亡。
没有剩余的 Gremlins 可以执行 union 步骤。所以遍历 return 是一个空结果。

你的另一遍历

g.V("user-347883719").outE("validate_phone").union(__.identity(), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))

return 是因为 Gremlin 可以执行 outE 步骤并且不会死亡。

无论您的用户顶点是否有向外的“validate_phone”边,此遍历总是 return 结果。

g.V("user-11").union(__.outE("validate_phone"), __.V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"))

g.V("user-11") 在 v[user-11]
上放置一个 Gremlin union 步骤要求这个 Gremlin 生成两个 child Gremlins。
第一个 child Gremlin 将执行第一个嵌套遍历 outE("validate_phone")。并且 return 边缘(如果存在)或消失。
第二个 child Gremlin 将执行嵌套遍历 V().hasId("phone-29e78c7c18a8bb33c608dbc233bc155e"),这将 return phone 顶点。