我上面有图表。其中橙色是我的父子层次结构,而 Green 是我的关系。因此,如果我想获得 E 和 F 之间的关系,我会得到 B 和 C 之间的关系。 strong>(因为他们是E和F的父母)。这种关系发现可能会影响到大多数父母。
我可以使用
这样的Gremlin查询来找到节点的父级g.V().has('name', 'D').repeat(out('parent')).emit().values('name')
此查询将返回我B和A。
问。在类似的行上,Gremlin或任何其他图形查询语言是否支持关系继承?应该如何形成Gremlin查询?
注意:图可能非常庞大,其中包含许多唯一节点和许多唯一关系。我想在短时间内获得继承的关系,这样我就不必预先计算并缓存它,也不必重复以备快速参考。
答案 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 )。