我正在处理一个问题,我已经将其提取了:
(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})
我正在尝试构造一个查询,其中数据与上图所示如上图所示。我要做的是获得一个节点及其两个以前的邻居。但是,有条件:
- 我只想返回共享相同"属性的邻居。
- 如果有一个不同的邻居是"是"属性,请跳过它。
- 如果一个节点少于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