Neo4j 将具有直接链接的节点与集合中的所有节点匹配

Neo4j 将具有直接链接的节点与集合中的所有节点匹配,neo4j,cypher,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 {i

当集合中只有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

您可以根据文章列表查找公共节点,然后确保随后匹配的编号与您匹配的编号相同

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

你有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

这实际上是可行的,但是如果集合中的任何节点具有不同的类型,没有文章,但是视频或歌曲,我们可以改进它吗?从查询的角度来看,最方便的方法是向节点添加另一个更通用的标签,如
Content
,并在其上创建索引。