层次关系的图遍历

时间:2019-06-06 13:22:35

标签: java graph gremlin arangodb janusgraph

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

我上面有图表。其中橙色是我的父子层次结构,而 Green 是我的关系。因此,如果我想获得 E F 之间的关系,我会得到 B C 之间的关系。 strong>(因为他们是E和F的父母)。这种关系发现可能会影响到大多数父母。

我可以使用

这样的Gremlin查询来找到节点的父级
g.V().has('name', 'D').repeat(out('parent')).emit().values('name')

此查询将返回我B和A。

问。在类似的行上,Gremlin或任何其他图形查询语言是否支持关系继承?应该如何形成Gremlin查询?

注意:图可能非常庞大,其中包含许多唯一节点和许多唯一关系。我想在短时间内获得继承的关系,这样我就不必预先计算并缓存它,也不必重复以备快速参考。

1 个答案:

答案 0 :(得分:0)

我认为,继承是指从祖父母到父母,再到孩子再到孙子,等等的能力。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”记录一样使用该名称搜索记录。

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