繁体   English   中英

Neo4j Cypher:获取给定条件下可变长度路径的邻居,跳过不满足条件的邻居

[英]Neo4j Cypher: Get neighbours for variable length path given condition, skip those that do not meet condition

我正在研究一个问题,因此将其抽象如下:

(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. 我只想返回共享相同“ IS”属性的邻居。
  2. 如果邻居具有不同的“ IS”属性,请跳过该属性。
  3. 如果一个节点的邻居少于2个,则返回1个或0个邻居。

我对此进行了尝试,但无法产生以下输出。 上图的COMPLETE输出应如下所示:

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

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

假设每个当前未标记的节点都有一个可用于查询的标签(我将在此处使用: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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM