neo4j - 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)
解决方案
至于为什么您的过滤不起作用,您的 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
推荐阅读
- c++ - 在 T 的静态成员中使用 sizeof(T) 的 c++ 错误
- r - 根据行号矩阵对数据帧进行子集化并将结果保存在一个列表中
- ssl - 如何使 HAProxy 的 SSL 重定向和路径重写(使用 reqrep)同时工作?
- python-2.7 - 操作超时 Splunk + Python
- mysql - 在 mySQL Server 客户端上设置远程访问引发错误 1064 (42000)
- android - ACTION_IMAGE_CAPTURE 返回图像质量差的位图,我在哪里可以获得高分辨率图像?
- android - 从应用服务器自动发送推送通知
- vb.net - 将列表框项目分成两部分并将它们粘贴到两个列表框中
- c# - GetCursorInfo WinForms 与 WPF C#
- java - 如何根据用户输入在循环中声明无限变量?