我正在研究一个问题,我已经将其抽象出来了:
(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})
我正在尝试构建一个数据相关的查询,如上图所示。我想要做的是获取一个节点及其前两个邻居。但是,有条件:
我已尝试过此但不能产生以下输出。上图的COMPLETE输出应如下所示:
a, b, c
b, c, d
c, d, f
d, f
e
f
注意,对于节点(c),我们返回(d),(f)和跳过(e),因为它是蓝色; (d)应该有类似的行为。 (e)只返回自己,因为它是唯一的蓝色节点。有谁知道这是否有一个简单的解决方案?
答案 0 :(得分:0)
假设每个当前未标记的节点都有一个可用于查询的标签(我将使用:此处为Node),这应该有效:
// 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