路径中具有多个关系的 Cypher BFS

问题描述

我想在图数据库 (memgraph-db) 中对自治系统及其关系进行建模

节点之间可以存在两种不同的关系:

  • 无向对等关系(图像中没有箭头的边缘)
  • 指导供应商2客户关系(箭头指向图像中的供应商)

下图显示了我想通过一些查询找到的有效路径

valid paths (source: caida.org)

它们可以被描述为

(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 查询格式的示例数据集(几个节点和边/一个小图)?我很高兴提出解决方案。