匹配一个节点,该节点具有指向集

时间:2017-07-28 09:33:25

标签: neo4j cypher

当集合中只有2个节点时,它相对容易

MATCH (a:Article {id : "PMID:16009338"}),(c:Article {id: "PMID:21743479"}) 
WITH a, c 
MATCH (a)-[r]-(d)-[r1]-(c)
RETURN d

但是3个节点的类似尝试并没有起作用

MATCH (a:Article {id : "PMID:16009338"}),(c:Article {id: "PMID:21743479"}), (p:Article {id: "PMID:21741956"})  
WITH a, c, p
MATCH (a)-[r]-(d)-[r1]-(c)-[r2]-(d)-[r3]-(p) 
RETURN d

它寻找c和d之间的不同关系。 r1和r2。如果我将r2更改为r1,它会说:不能使用相同的关系变量' r1'多种模式。

即使我让它工作,也不可能有4个以上的节点。

==== 尝试使用不同类型的3个节点,执行速度足够快

MATCH (a:Article {id : "AID:16009338"}),(v:Video {id: "VID:21743479"}), (s:Song {id: "SID:21741956"})  
WITH a, v, s 
MATCH (a)-[]-(d) 
WITH d, v, s 
MATCH (v)-[]-(d) 
WITH d, s 
MATCH (s)-[]-(d) 
RETURN d

2 个答案:

答案 0 :(得分:2)

您可以针对文章列表查找公共节点,然后确保之后匹配的数字与您匹配的数字相同。

WITH ['PMID:16009338','PMID:21743479','PMID:21741956'] as articles
MATCH (d)--(a:Article)
WHERE a.id in articles
WITH articles, d, COLLECT(a) AS matched
WHERE size(articles) = size(matched)
RETURN d

答案 1 :(得分:0)

所以你有X节点都需要连接到其他节点D?

MATCH (a:Article {id : "AID:16009338"})--(d),(v:Video {id: "VID:21743479"})--(d), (s:Song {id: "SID:21741956"})--(d)
RETURN d

如果您知道关系的方向,请将其添加进去。如果您知道关系的名称,请同时添加:

MATCH (a:Article {id : "AID:16009338"})-[:ART_TO_D]->(d),(v:Video {id: "VID:21743479"})-[:VID_TO_D]->(d), (s:Song {id: "SID:21741956"})-[:SONG_TO_D]->(d)
RETURN d