Neo4j查找返回同一节点的所有路径

时间:2015-11-04 23:20:56

标签: neo4j cypher graph-databases

我有实体(例如A,B,C)可以发送一个或多个协议(TCP,UDP和FTP),并且可以接收一个或多个协议,如下图所示。

我想创建一个cypher查询,它将查找从给定实体返回同一实体的所有可能路径,从最短路径到最长路径排序,基于跳数。

enter image description here

可以使用以下创建脚本在neo4j Console在线进行测试:

create (a:Entity {name:'A'}), 
(b:Entity {name: 'B'}), 
(c:Entity {name: 'C'}), 
(d:Entity {name: 'D'}),  
(tcp:Protocol {name: 'TCP'}),  
(ftp:Protocol {name: 'FTP'}),  
(udp:Protocol {name: 'UDP'}),  
(a)-[:SEND]->(tcp), (tcp)-[:SEND]->(b), (tcp)-[:SEND]->(d), (b)-[:SEND]->(ftp), (ftp)-[:SEND]->(c), (ftp)-[:SEND]->(d), 
(d)-[:SEND]->(udp), (c)-[:SEND]->(udp), (udp)-[:SEND]->(a)

确保首先单击顶部栏中的“清除数据库”

1 个答案:

答案 0 :(得分:1)

MATCH path=(source { name:'A' })-[r*4..10]-> source
RETURN path, length(path)/2-1 AS hops
ORDER BY hops

说明:

{ name:'A' } - 用于标识源节点

[4..10] - 用于指定最小和最大跳数(包括)。在这种情况下,低于4跳是不可能的,因为最小跳数是4:

实体 - >协议 - >实体 - >协议 - >实体

length(path)/2-1 AS hops - 计算路径中存在的实体跳数。请注意,length(path)包含实体和协议。