Neo4J Cypher:在给定条件下,请求助于可变长度路径的邻居,跳过那些不符合条件的邻居



我正在处理一个问题,我已经将其提取了:

(a)-[:PREVIOUS]->(b)-[:PREVIOUS]->(c)-[:PREVIOUS]->(d)-[:PREVIOUS]->(e)-[:PREVIOUS]->(f)
(b)-[:IS]->(:Colour {Name: 'Red'})
(c)-[:IS]->(:Colour {Name: 'Red'})
(d)-[:IS]->(:Colour {Name: 'Red'})
(e)-[:IS]->(:Colour {Name: 'Blue'})
(f)-[:IS]->(:Colour {Name: 'Red'})

注意,

(:Colour {Name: 'Red'}) 

是唯一的,并且连接到许多节点,例如

(a)-[:IS]->(:Colour {Name: Red})<-[:IS]-(b) 

,但只有

(e)-[:IS]->(:Colour {Name: Blue})

我正在尝试构造一个查询,其中数据与上图所示如上图所示。我要做的是获得一个节点及其两个以前的邻居。但是,有条件:

  1. 我只想返回共享相同"属性的邻居。
  2. 如果有一个不同的邻居是"是"属性,请跳过它。
  3. 如果一个节点少于2个邻居,则返回1或0个邻居。

我已经尝试了此尝试,但无法产生以下输出。上图的完整输出应该像这样:

a, b, c
b, c, d
c, d, f
d, f
e
f

请注意,对于节点(c(,我们会返回(d(,(f(和跳过(e(,因为它为蓝色;(d(应具有类似的行为。(e(仅返回,因为它是唯一的蓝色节点。有人知道是否有一个简单的解决方案?

假设当前未标记的节点的每个标签都可以用于查询(我只是在这里使用:节点(,这应该有效:

// for each node, get its color
MATCH (n:Node)-[:IS]->(myColor)
// find paths to all previous nodes (where the colors match)
// this includes the starting node, which has distance 0
MATCH path = (n)-[:PREVIOUS*0..]->(prev)
WHERE (prev)-[:IS]->(myColor)
// for each node, order its previous nodes by distance
WITH n, prev
ORDER BY length(path) ASC
// grab first three closest (first will always be the node itself)
WITH n, collect(prev)[..3] as prevs
RETURN prevs
ORDER BY size(prevs) DESC

最新更新