Neo4j 我如何构造一个密码查询,以包含MATCH子句中节点之间的路径,而不删除不';不匹配;全称;图案

Neo4j 我如何构造一个密码查询,以包含MATCH子句中节点之间的路径,而不删除不';不匹配;全称;图案,neo4j,cypher,Neo4j,Cypher,我已经尝试了很多方法,所以我不会一一列举。让我解释一下我想要实现的目标: 假设我有3种类型的节点:A、B和C,它们可能有(:A-->(:B)和(:B-->(:C)和(:C-->(:C)形式的定向链接 我想要的是来自特定a节点的一条和两条链路的B和C节点,以及通过在公共C节点上聚合的路径将两个C节点连接在一起的任何现有路径 首先,我想返回来自某个特定实例的B和C节点,如: MATCH (a:A)-->(b:B)-->(c:C) RETURN b,c 我还想包括节点集c在公共c节点上会

我已经尝试了很多方法,所以我不会一一列举。让我解释一下我想要实现的目标:

假设我有3种类型的节点:A、B和C,它们可能有(:A-->(:B)和(:B-->(:C)和(:C-->(:C)形式的定向链接

我想要的是来自特定a节点的一条和两条链路的B和C节点,以及通过在公共C节点上聚合的路径将两个C节点连接在一起的任何现有路径

首先,我想返回来自某个特定实例的B和C节点,如:

MATCH (a:A)-->(b:B)-->(c:C)
RETURN b,c
我还想包括节点集
c
在公共
c
节点上会聚的所有路径。差不多

MATCH path=(c)-[*]->(c2:C)<-[*]-(c)
RETURN path
匹配路径=(c)-[*]->(c2:c)
匹配(a:a)-->(b:b)-->(c:c)
对于a,收集(不同的b)作为b节点,收集(不同的c)作为c节点

可选匹配(c:c)-->(c2:c)冲床让我非常接近,我做了一些修改以获得所需:

MATCH (a:A {name:"a_name"})-->(b:B)-->(c:C)
WITH COLLECT(DISTINCT b) as bs, COLLECT(DISTINCT c) as cs
MATCH convergingPath=(c:C)-[*]->(c2:C)<-[*]-(c1:C)
WHERE c in cs AND c1 in cs AND c<>c1
RETURN bs, cs, convergingPath
MATCH(a:a{name:a_name})-->(b:b-->(c:c)
使用COLLECT(不同的b)作为b,COLLECT(不同的c)作为c

MATCH convergingPath=(c:c)-[*]->(c2:c)非常感谢,它非常接近我所需要的,经过一些修改,我得到了它。将发布我用作答案的内容。请修复第3段中的打字错误(“oen”)。请注意,
(c:c)-[*]->(c2:c)谢谢,在我的情况下,它确实隐含地满足了它们,我还可以基于该节点类型专有的关系标签来指定它们。还有其他方法吗?如果您有一个关系类型(例如,
FOO
)专门用于
C
节点之间,那么下面的模式应该只返回所有内部节点都有
C
标签的路径:
(C:C)-[:FOO*]->(在这种情况下,如果您没有收敛的C类型节点,它不会返回任何节点。这就是为什么我在那里使用可选匹配
MATCH (a:A {name:"a_name"})-->(b:B)-->(c:C)
WITH COLLECT(DISTINCT b) as bs, COLLECT(DISTINCT c) as cs
MATCH convergingPath=(c:C)-[*]->(c2:C)<-[*]-(c1:C)
WHERE c in cs AND c1 in cs AND c<>c1
RETURN bs, cs, convergingPath