java - 层次关系的图遍历

标签 java graph gremlin janusgraph jgrapht

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

我有上面的图表。其中橙色是我的父子层次结构,绿色是我的关系。因此,如果我想获得 EF 之间的关系,我将获得 BC 之间的关系(因为它们是 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/

相关文章:

javascript - 如何在版本 ^3 上使用 gremlin 启动与 Cosmos DB 图形数据库的新连接

java - 从不同的 JAVA 类调用方法

java - Spring AOP 中 @DeclareParents 注解中的泛型类型

java - 让 Jersey 1.x 和 2.x 共存

python - 在TensorFlow中显示图形图像?

java - 在 Gremlin 3.2.5-SNAPSHOT 之后,我无法在函数 hasLabel() 中传递顶点标签数组

java - 在java中使用套接字向服务器发送请求

algorithm - 磁盘上的无向图

facebook - 优化搜索。如何降低复杂度?

c# - 为什么我的 gremlin.net gremlin 客户端无法与 azure cosmos graph db 一起使用