【问题标题】:Gremlin DFS/BFS Search while avoiding LoopsGremlin DFS/BFS 搜索同时避免循环
【发布时间】:2021-03-25 08:03:49
【问题描述】:

在 Gremlin 中,我试图在我的图中找到所有连接的节点 - 使用 BFS 或 DFS 我不担心遍历方法,因为我将有一个边列表,其中将显示节点之间的连接输出类似于

[
 Nodes : [ {id : 1, name: "abc"}, "{id: 2, name : "pqr"],
 Edges : [ {id : 100, label : ParentOf, from : 1, to : 2 }, {id : 101, label : ChildOf, from : 2, to : 1 }]
]

我的图表看起来像这样

我的问题在于循环 - 我试图只发出连接的节点,比如我从节点 1 开始

g.V('a07771c3-8657-4535-8302-60bcdac5b753').repeat(out('knows')).until(__.not(outE('knows'))).path().
       unfold().dedup().id().fold()

我最终得到了错误

Gremlin Query Execution Error: Exceeded maximum number of loops on a repeat() step. Cannot exceed 32 loops. Recommend limiting the number of loops using times(n) step or with a loops() condition

我正在寻找一种查询跳过已经发出的节点的方法?不完全确定如何做到这一点

【问题讨论】:

    标签: azure-cosmosdb gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

    simplePath 步骤可用于防止循环。

    g.V('a07771c3-8657-4535-8302-60bcdac5b753').
      repeat(out('knows').simplePath()).
      until(__.not(outE('knows'))).path().
      unfold().
      dedup().
      id().
      fold()
    

    【讨论】:

    • g.V('a07771c3-8657-4535-8302-60bcdac5b753'). repeat(out('knows').simplePath()) 这会导致空输出 - 我正在考虑一个示例,其中“A”知道“B”,“B”知道“C”,“C”知道“A”
    • 您仍然需要包含 until 部分,正如我在回答中所展示的那样。您也可以尝试使用until(cyclicPath())
    • 所以你可以有一个类似于until(not(out()).or().cyclicPath())until
    • 我想我弄明白了为什么 g.V('a07771c3-8657-4535-8302-60bcdac5b753'). repeat(out('knows').simplePath()) 这不起作用 - 我最后错过了 .emit(),谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多