【问题标题】:Gremlin loop traversal through various edges directionsGremlin 循环遍历各种边缘方向
【发布时间】:2013-05-06 16:38:29
【问题描述】:

我有图表(见下图)。我使用 A 中的 gremlin,需要沿着边缘“影响”和“similarTo”循环所有树。

所以我需要类似的东西:

g.v(A.id).out('impacts', 'similarTo').loop(1){it.loops < 4}{true}

这个查询的问题是,关系“similarTo”有时可能在边缘,有时在边缘(见图表),这取决于应用程序目前如何存储数据。我不能简单地使用 "both" (g.v(A.id).both('impacts', 'similarTo')...) 来检索边缘,因为另一方面我只需要 out edge 来实现“影响”关系。也有可能,某些顶点(例如 C)缺少“similarTo”边,在这种情况下,循环应该只遵循“影响”关系。

最后我尝试了这样的东西,但我认为我用错了,结果不合适:

g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}

我也试图在遍历过程中按方向过滤边缘,但它可能不受支持,所以这也不起作用:

g.v(A.id).as('x').bothE.filter{((it.label=='impacts' & it.direction=='out') || it.label=='similarTo')}.bothV.loop('x'){it.loops < 4}{true}

有什么建议吗?

【问题讨论】:

    标签: graph neo4j gremlin titan


    【解决方案1】:

    所以最后我意识到gremlin的正确方法应该是:

    g.v(A.id).as('x').copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}
    

    但目前 gremlin 中存在错误 (see bug report) 并且 copySplit 不适用于循环。无论如何,我必须在 copySplit 之前添加 ._() 才能使其正常工作:

    g.v(A.id).as('x')._().copySplit(_().out('impacts'), _().both('similarTo')).fairMerge.loop('x'){it.loops < 4}{true}
    

    【讨论】:

      【解决方案2】:

      我没有使用 Gremlin 的经验,但在 Cypher 中,您可以按以下方式执行此操作:

      START n=node({id})
      MATCH p=n-[:impacts|similarTo*3]-m
      RETURN p
      

      这个查询返回所有包含单向关系的路径,类型为 Impact 和 SimilarTo,深度为 3。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多