在遍历期间选择2个可用边

时间:2018-05-28 04:12:24

标签: gremlin tinkerpop3

我对Gremlin来说相对较新,而我与之合作的公司正在寻求实现一个图形数据库,其中包含一些临时边缘。每个顶点可以有1个或多个边,每个边都有一个属性,基本上是isTemporary true / false。

当遍历图表时,如果"是临时" = true我们应该遵循这个优势,否则我们应该遵循" isTemporary" = false。

即,

A-[isTemporary:true, value 1] -> B

A-[isTemporary:false, value 2] -> C

B-[isTemporary: false, value 3] -> D

在这种情况下,运行单个gremlin查询应返回A-> B-> D.

我查看过TinkerPop3文档,似乎"选择"可能是我想在这里使用的,但所有的例子似乎都返回一个值,当我想要的是一个遍历回来,所以我可以反复对遍历进行操作。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您可能正在寻找coalesce步骤。

考虑此图表:

g.addV().as('a').property('name', 'A').
  addV().as('b').property('name', 'B').
  addV().as('c').property('name', 'C').
  addV().as('d').property('name', 'D').
  addE('someLink').from('a').to('b').
    property('isTemporary', true).property('value', 1).
  addE('someLink').from('a').to('c').
    property('isTemporary', false).property('value', 2).
  addE('someLink').from('b').to('d').
    property('isTemporary', false).property('value', 3)

以下查询将返回从A到D的所有路径,尝试遍历isTemporary: true边缘(如果存在),或通过isTemporary: false边缘(否则合并步骤),迭代地遍历。

g.V().has('name', 'A').
  repeat(
    coalesce(
      outE().has('isTemporary', true).inV(),
      outE().has('isTemporary', false).inV()
    )
  ).
  until(has('name', 'D')).
  path().by('name')

结果:

==>[A,B,D]