我有上面的图表。其中橙色是我的父子层次结构,绿色是我的关系。因此,如果我想获得 E 和 F 之间的关系,我将获得 B 和 C 之间的关系(因为它们是 E 和 F 的 parent )。这种关系发现可以上报给大多数家长。
我可以使用 Gremlin 查询找到节点的父节点,例如
g.V().has('name', 'D').repeat(out('parent')).emit().values('name')
此查询将返回 B 和 A。
问。类似地,Gremlin 或任何其他图形查询语言是否支持关系继承? Gremlin 查询应如何形成?
注意:图可能非常巨大,包含许多独特的节点和许多独特的关系。我想快速获取继承的关系,这样我就不必预先计算和缓存它或复制以供快速引用。
最佳答案
我认为继承是指从祖 parent 到 parent 到 child 到孙子等的遍历能力...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)。
关于java - 层次关系的图遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478546/