首页 > 解决方案 > Neo4J (Cypher) 查询以查找所有不遵循模式的路径

问题描述

我有以下图表: 图表

我想获取不遵循预定义模式的从 Label_1 到 Label_5 的路径。特别是,我想获得不遵循模式的路径:Label_1 -> Label_2 -> Label_3 -> Label_4 -> Label_5

正如您在图中看到的那样,较低的分支(在 Label_1 之后)遵循这种模式,而上部的分支没有遵循这种模式,因为我们有Label_1 -> Label_2 -> Label_4 -> Label_5

这意味着我正在搜索将返回的查询:Label_1 -> Label_2 -> Label_4 -> Label_5

我尝试了以下查询,但是这个查询没有返回任何结果。

MATCH p=(e1n:Label_1)-[*]->(e2:Label_5)
WHERE NOT (:Label_1)-->(:Label_2)-->(:Label_3)-->(:Label_4)-->(:Label_5)
RETURN p

由于我是 Neo4j 和 Cypher 的新手,我想问一下如何编写这样的查询以及为什么我的 WHERE NOT 方法不起作用。

对于创建,我使用了以下创建命令:

CREATE (a:Label_1 {name: "Label_1"})
CREATE (b:Label_2 {name: "Label_2"})
CREATE (c:Label_2 {name: "Label_2"})
CREATE (d:Label_3 {name: "Label_3"})
CREATE (e:Label_4 {name: "Label_4"})
CREATE (f:Label_5 {name: "Label_5"})
CREATE (a)-[:FOLLOWS]->(b)
CREATE (a)-[:FOLLOWS]->(c)
CREATE (b)-[:FOLLOWS]->(d)
CREATE (c)-[:FOLLOWS]->(e)
CREATE (d)-[:FOLLOWS]->(e)
CREATE (e)-[:FOLLOWS]->(f)

标签: neo4jcypher

解决方案


至于为什么您的过滤不起作用,您的 WHERE 子句中的模式不适用于您的 MATCHed 路径。如果整个图表中不存在这样的模式,您要求它过滤掉结果。由于在您的图表中出现了从 :Label_1 到 :Label_5 的模式,因此您的 MATCH 将始终失败。

您可以尝试收集要排除和过滤的路径,以使任何 MATCHed 路径不在排除集中:

MATCH path = (:Label_1)-->(:Label_2)-->(:Label_3)-->(:Label_4)-->(:Label_5)
WITH collect(path) as excluded
MATCH p=(e1n:Label_1)-[*]->(e2:Label_5)
WHERE NOT p IN excluded
RETURN p

推荐阅读