能否在MariaDB的OQGRAPH查询中筛选节点间的关系?
在MariaDB OQGRAPH中获取节点间关系的方法
嘿,刚好我对OQGRAPH存储引擎有过实践,你想在查询里拿到节点间的具体关系类型,完全可以实现,给你两种实用的方案:
方案1:用traverse模式遍历每一段相邻关系
OQGRAPH的traverse模式会返回路径中的每一对相邻节点,我们只需要把它和原始的people_relationships表关联,就能直接拿到对应的关系:
SELECT g.origid, g.destid, pr.relationship, g.distance FROM people_graph g JOIN people_relationships pr ON g.origid = pr.origid AND g.destid = pr.destid WHERE g.latch = 'traverse' AND g.origid = 1 AND g.destid IS NOT NULL;
这个查询会返回从节点1出发,每一步跳转的节点对和对应的关系(比如1→2是friend,2→3是friend等),还能看到每段的距离(默认是1)。
方案2:结合dijkstras模式获取完整路径的关系序列
如果想一次性拿到从节点1到目标节点的完整路径,同时附带每一步的关系,可以利用OQGRAPH返回的path列(逗号分隔的节点序列),通过关联原始表来拼接关系:
SELECT g.origid, g.destid, g.path, GROUP_CONCAT(pr.relationship ORDER BY FIND_IN_SET(pr.origid, g.path)) AS path_relationships FROM people_graph g JOIN people_relationships pr ON FIND_IN_SET(pr.origid, g.path) > 0 AND FIND_IN_SET(pr.destid, g.path) = FIND_IN_SET(pr.origid, g.path) + 1 WHERE g.latch = 'dijkstras' AND g.origid = 1 GROUP BY g.origid, g.destid, g.path;
举个例子,假设到节点5的路径是1,2,3,4,5,这个查询会返回friend,friend,friend,father这样的关系序列,清晰展示整条路径的关系链。
注意事项
- 如果你创建OQGRAPH表时设置了
directed=1(单向图),要确保原始关系的方向和查询需求匹配;默认directed=0是双向图,适合大多数场景。 - 若你的关系表有重复的节点对(比如双向记录),可以在JOIN时加额外条件避免重复。
内容的提问来源于stack exchange,提问作者Mike Reiche
相关产品推荐
相关产品推荐

