【问题标题】:Choose between 2 available edges during traversal在遍历期间在 2 个可用边之间进行选择
【发布时间】:2018-05-28 04:12:24
【问题描述】:

我对 Gremlin 比较陌生,我所在的公司正在寻求实现一个图形数据库,其中包含一些临时边。每个顶点可以有 1 条或多条边,每条边上都有一个属性,本质上是 isTemporary true/false。

在遍历图时,如果 "isTemporary" = 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 文档,似乎“选择”可能是我想在这里使用的,但所有示例似乎都返回了一个值,而我想要的是返回的遍历,所以我可以反复作用于遍历。

任何帮助将不胜感激。

【问题讨论】:

    标签: gremlin tinkerpop3


    【解决方案1】:

    您可能正在寻找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]
    

    【讨论】:

    • 谢谢!这可能正是我正在寻找的,我很快就会在这里测试它。我喜欢它只是一个错误地思考问题的问题。我们正在从 Cypher 迁移,并且大量使用 unwind 来解决此类问题使得迁移变得棘手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2012-03-09
    相关资源
    最近更新 更多