【问题标题】:Graph traversal for hierarchical relations层次关系的图遍历
【发布时间】:2019-06-06 13:22:35
【问题描述】:

我有图表示父子层次结构。它还保存对象之间的关系。

我有上面的图表。 Orange 是我的父子层次结构,Green 是我的关系。所以如果我想得到 EF 之间的关系,我会得到 BC 之间的关系strong>(因为他们是 E 和 F 的父母)。这种关系发现可以上升到大多数父母。

我可以使用 Gremlin 查询找到节点的父节点,例如

g.V().has('name', 'D').repeat(out('parent')).emit().values('name')

此查询将返回 B 和 A。

问。 Gremlin 或任何其他图形查询语言是否支持关系继承? Gremlin 查询应该如何形成?

注意:图可能非常巨大,包含许多独特的节点和许多独特的关系。我想快速获取继承关系,这样我就不必预先计算和缓存它或制作重复以供快速参考。

【问题讨论】:

    标签: java graph gremlin janusgraph jgrapht


    【解决方案1】:

    我假设继承是指从祖父母到父母再到孩子再到孙子等的能力... Arango 支持遍历并且能够非常快速地遍历这些类型的关系。例如,要复制上面从节点 D 开始并获取节点 B 和 A 的示例,您可以执行以下操作:

    // Find all nodes that are named d
    let dNodes = (FOR test in test2
                FILTER test.name == 'd'
                RETURN test)
    
    //Traverse outbound relationships starting at the dNodes and return up to 2 nodes up the hierarchy
    FOR node in dNodes
       FOR v,e IN 1..2 OUTBOUND node
       testEdge
    RETURN v
    

    在性能方面,我已经遍历了具有数千个节点的不规则层次结构,没有性能问题,也不需要缓存任何东西。但是请记住,这里没有魔法,无论数据库引擎如何,糟糕的数据模型都会造成麻烦。

    这里有一些性能信息,如果你想回顾和玩它here

    遍历多个边(关系类型)与我们之前的示例非常相似。要使用层次结构(橙色)边和关系(绿色)边找到从 E 到 F 的路径,我们可以这样做:

    // Find all nodes that are named E
    let eNodes = (FOR test in test3
                FILTER test.name == 'E'
                RETURN test
                )
    
    // Start in node E and go upto three steps
    // Traverse the hierarchy edges in any direction (so that we can find parents and child nodes)
    // Traverse the relatedto (green) edges in the outbound direction only
    // Filter the traversal to items that end in vertice F and return the path (E<-B->C->F)
    FOR node in eNodes
       FOR v,e,p IN 1..3 ANY node
       parentOf, OUTBOUND relatedTo 
       FILTER v.name == 'F'
    RETURN p
    

    或者如果我们只想要 E 和 F 之间的最短路径,我们可以这样做:

    let eNodes = (FOR test in test3
                FILTER test.name == 'E'
                RETURN test
                )
    //Find shortest path between node E and F and return the path (E<-B->C->F)            
    FOR node in eNodes
        FOR v, e IN ANY SHORTEST_PATH
          node TO 'test3/F'                 
          parentOf, OUTBOUND relatedTo
    RETURN e
    

    请注意,我只是在上面的代码中使用了“F”记录的 id,但我们可以像搜索“E”记录一样使用名称搜索记录。

    还请注意,我们在数据库中将示例的边数据创建为有向边:parentOf 边是从父级到子级创建的(例如:A 到 B),对于绿色关系边,我们按字母顺序创建它们(例如:B 到 C )。

    【讨论】:

    • 我想获取对象之间继承的关系。遍历任何对象的层次结构都可以,但同时遍历 2 个对象的层次结构是我想要的。或任何其他有效的方式...
    • 那么在您的示例中,您是否尝试使用橙色和绿色关系从 E 转到 F?
    • 是的。我最终需要的是 E 和 F 之间的绿色关系(实际上是 B 和 C 之间)。橙色是我的父子关系,而绿色是我的相关关系。
    • @SuhasD ,我在上面添加了一个示例,展示了如何获取从 E 到 F 的路径。希望这能让我们更接近您正在寻找的内容。
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多