在neo4j中没有收到警告的情况下,在2个节点之间找到路径的正确方法是什么?

时间:2017-07-20 11:23:34

标签: neo4j cypher

我目前正在使用neo4j,我需要找到大图中2个节点之间的路径。我正在使用这个密码查询:

MATCH p=(acq:Acquisition {id:'1'})-[r*]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p

一切都按预期工作(查询返回节点之间任意长度的路径)但是我收到警告消息:

  

警告:此功能已弃用,将在以后的版本中删除。不推荐将关系绑定到可变长度模式中的列表。

官方documentation使用与*相同的模式。

在没有得到任何警告的情况下(不使用弃用语法)在节点之间找到任意长度路径的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

3.2.0-rc1以来,不推荐将关系绑定到可变长度模式中的列表。

根据pull request Cypher的查询:

MATCH (n)-[rs*]-() RETURN rs

将生成警告,并且编写相同查询的规范方法是:

MATCH p=(n)-[*]-() RETURN relationships(p) AS rs

由于您未在查询中使用r变量,因此只需将其从查询中删除,警告就会消失。这样:

MATCH p=(acq:Acquisition {id:'1'})-[*]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p

答案 1 :(得分:0)

所有这些意味着这是未来版本,您将不再允许在您的模式中使用r。您的查询需要看起来像这样,否则将在以后的版本中中断。由于您没有直接尝试在结果中使用r,因此删除它应该没有问题。

MATCH p=(acq:Acquisition {id:'1'})-[*]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p

如果你需要在比赛结束后对这些关系做些什么,你总是可以使用relationships(p)来获取关系路径中的一系列关系。

取决于图表的性质(大小和复杂性),尽管您的查询可能变得难以处理,因为除了结束节点和方向之外它几乎不受约束。有很多方法可以让它更安全。

1 - 使用shortestPath

您可以使用shortestPathallShortestPaths

MATCH p=allShortestPaths((acq:Acquisition {id:'1'})-[*]->(ecs:ExternalCommunicationService {id:'1'}))
RETURN p

2 - 限制深度

您可以在比赛深度上添加限制。它可以修复

MATCH p=(acq:Acquisition {id:'1'})-[*10]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p

或范围

MATCH p=(acq:Acquisition {id:'1'})-[*5..10]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p

3 - 添加关系类型

您可以添加一个或多个标签,以减少您匹配的潜在路径数。这可以与深度参数一起使用。

MATCH p=(acq:Acquisition {id:'1'})-[:TYPE_A|TYPE_B*5..10]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p

4 - 使用APOC

您可以使用APOC程序。