cypher - 路径中具有多个关系的 Cypher BFS
问题描述
我想在图形数据库(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 中查询这种形式的路径?
作为替代方案,我可以进行单独的查询,在其中指定每个段的长度,然后对每个路径长度进行查询,直到找到路径。
IE
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++ 实现。请看这里。我建议从 Python 开始,因为它更容易。PoC 的 Python 应该没问题。我还建议从这个选项开始,因为我非常有信心该解决方案会起作用,而且它是模块化的。毕竟,filter_procedure
可以轻松扩展,而查询将保持不变。
您能否提供一个 Cypher 查询格式的示例数据集(几个节点和边/一个小图)?我很高兴提出解决方案。