【问题标题】:Filtering a Gremlin Traversal by edge label按边缘标签过滤 Gremlin 遍历
【发布时间】:2019-03-22 12:05:34
【问题描述】:

我正在尝试使用 Gremlin 从起始节点向外遍历到 X 度连接范围内的所有连接节点。连接的方向无关紧要,所以我使用both() 函数。我还希望能够防止遍历带有特定标签的边缘。这是一个示例图表。

gremlin> g.addV().property(id,1).as('1').
......1>   addV().property(id,2).as('2').
......2>   addV().property(id,3).as('3').
......3>   addV().property(id,4).as('4').
......4>   addV().property(id,5).as('5').
......5>   addV().property(id,6).as('6').
......6>   addV().property(id,7).as('7').
......7>   addE('edge1').from('1').to('2').
......8>   addE('edge2').from('1').to('3').
......9>   addE('edge2').from('2').to('4').
.....10>   addE('edge3').from('3').to('5').
.....11>   addE('edge3').from('4').to('6').
.....12>   addE('edge4').from('7').to('6').iterate()

到目前为止我的遍历是这样的:

gremlin> g.V(1).
......1>   repeat(both().filter(not(inE('edge3')))).
......2>   times(4).
......3>   emit().
......4>   simplePath().
......5>   dedup()

然而,这并不是我想要的。我想要一些东西,如果它必须穿过指定的边缘,它实际上会阻止遍历器击中顶点。我当前的实现过滤具有传入边缘的顶点,但在某些情况下,如果遍历器越过不同的边缘到达那里,我可能仍然希望该顶点出现在结果中。

这有意义吗?简而言之,我试图专门过滤一条边,而不是一个顶点与其边的关系。

【问题讨论】:

    标签: gremlin tinkerpop


    【解决方案1】:

    我想我听懂了你所说的,难道你不能只使用bothE() 并在遍历它们时过滤这些边缘吗:

    gremlin> g.V(1).
    ......1>   repeat(bothE().not(hasLabel('edge3')).otherV()).
    ......2>     times(4).
    ......3>     emit().
    ......4>   simplePath().
    ......5>   dedup()
    ==>v[2]
    ==>v[3]
    ==>v[4]
    

    【讨论】:

    • 我最终为“both”函数提供了字符串参数,它提供了一个包含列表而不是排除列表。这似乎是排除列表的一个很好的解决方案。
    • 当然...如果您知道标签,包含列表会更好。我只是没有那样读你的问题,否则我会建议的。很高兴你有你的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多