我目前正在使用neo4j
,我需要找到大图中2个节点之间的路径。我正在使用这个密码查询:
MATCH p=(acq:Acquisition {id:'1'})-[r*]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p
一切都按预期工作(查询返回节点之间任意长度的路径)但是我收到警告消息:
警告:此功能已弃用,将在以后的版本中删除。不推荐将关系绑定到可变长度模式中的列表。
官方documentation使用与*
相同的模式。
在没有得到任何警告的情况下(不使用弃用语法)在节点之间找到任意长度路径的正确方法是什么?
答案 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)
来获取关系路径中的一系列关系。
取决于图表的性质(大小和复杂性),尽管您的查询可能变得难以处理,因为除了结束节点和方向之外它几乎不受约束。有很多方法可以让它更安全。
您可以使用shortestPath
或allShortestPaths
MATCH p=allShortestPaths((acq:Acquisition {id:'1'})-[*]->(ecs:ExternalCommunicationService {id:'1'}))
RETURN p
您可以在比赛深度上添加限制。它可以修复
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
您可以添加一个或多个标签,以减少您匹配的潜在路径数。这可以与深度参数一起使用。
MATCH p=(acq:Acquisition {id:'1'})-[:TYPE_A|TYPE_B*5..10]->(ecs:ExternalCommunicationService {id:'1'})
RETURN p
您可以使用APOC程序。