问题描述
我想在图数据库 (memgraph-db) 中对自治系统及其关系进行建模
节点之间可以存在两种不同的关系:
- 无向对等关系(图像中没有箭头的边缘)
- 指导供应商2客户关系(箭头指向图像中的供应商)
它们可以被描述为
(s)-[:provider*0..n]->()-[:peer*0..n]—()<-[:provider*0..n]-(d)
或者换句话说
0-n 个 c2p 边,然后是 0-n 个 p2p 边,然后是 0-n 个 p2c 边
我可以修复第一个和最后一个节点,并希望找到一条(最短/最便宜)路径。据我所知,如果路径上有一个关系,我可以做 BFS。
有没有办法在 Cypher 中查询这种形式的路径?
作为替代方案,我可以执行单独的查询,在其中指定每个段的长度,然后对每个路径长度执行查询,直到找到路径。
即
MATCH (s)<-[]->(d) // All one hop paths
MATCH (s)-[:provider]->()-[:peer]-(d)
MATCH (s)-[:provider]->()<-[:provider]-(d)
...
解决方法
因为有 7 个不同的路径部分是可行的,所以我看不出 3 个 BFS 模式 (... BFS*0..n
) 如何产生有效的解决方案。不可能有空路径,因为模式在它们之间包含一些节点(我必须仔细检查)。
编写单个模式并不好。
一些选项是:
-
MATCH path=(s)-[:BFS*0.n]-(d) WHERE {{filter_expression}}
-> 表达式必须非常复杂才能产生有效路径。 -
MATCH path=(s)-[:BFS*0.n]-(d) CALL module.filter_procedure(path)
->module.procedure(path)
可以用 Python 或 C/C++ 实现。请看一下here。我建议从 Python 开始,因为它更容易。用于 PoC 的 Python 应该没问题。我还建议从这个选项开始,因为我非常有信心该解决方案会起作用,而且它是模块化的。毕竟,filter_procedure
可以轻松扩展,而查询将保持不变。
您能否提供一个 Cypher 查询格式的示例数据集(几个节点和边/一个小图)?我很高兴提出解决方案。