首页 > 解决方案 > 路径中具有多个关系的 Cypher BFS

问题描述

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

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

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

有效路径(来源:caida.org)

它们可以描述为

(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)
...

标签: cyphergraph-databasesredisgraphmemgraphdb

解决方案


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


推荐阅读