Cypher查询与其他节点相关的节点,其中所有其他节点出现在给定集合中

时间:2014-01-19 17:45:31

标签: neo4j cypher

我有一个基于被标记的事物概念的域,其建模类似于:

(item:Item)-[:TAGGED_BY]->(itemTag:Tag)

这是我第一次使用Cypher进行的实验,但我很难对所有某些给定标记标记的项目进行查询。例如:

CREATE
(item1:Item { name:"Item1"}),
(item2:Item { name:"Item2"}),
(item3:Item { name:"Item3"}),
(item4:Item { name:"Item4"}),
(item5:Item { name:"Item5"}),
(tag1:Tag { text: "T1" }),
(tag2:Tag { text: "T2" }),
(tag3:Tag { text: "T3" }),
(tag4:Tag { text: "T4" }),
item1-[:TAGGED_BY]->tag1,
item1-[:TAGGED_BY]->tag2,
item1-[:TAGGED_BY]->tag3,
item2-[:TAGGED_BY]->tag1,
item3-[:TAGGED_BY]->tag2,
item3-[:TAGGED_BY]->tag3,
item4-[:TAGGED_BY]->tag3;

我可以通过多种不同的方式找到被“T1”或“T2”标记的项目(返回item1,item2,item3),但似乎无法为所有标记的项目提出查询通过两个“T1”和“T2”(仅返回item1)。

任何帮助都将不胜感激 - 谢谢。

2 个答案:

答案 0 :(得分:1)

您正在寻找的查询是

MATCH (n:Item)-[:TAGGED_BY]->(Tag{text:"T2"}) 
WITH n 
MATCH (n)-[:TAGGED_BY]->(Tag{text:"T2"}) 
RETURN n;

答案 1 :(得分:0)

你也可以这样做:

MATCH (n:Item)-[:TAGGED_BY]->(t:Tag)
WHERE t.text IN ['T1','T2','T3','T4']
WITH n, count(*) as tags
WHERE tags = 4
RETURN n

带参数

MATCH (n:Item)-[:TAGGED_BY]->(t:Tag)
WHERE t.text IN {tags}
WITH n, count(*) as tags
WHERE tags = length({tags})
RETURN n