Neo4j匹配多种关系

时间:2013-04-12 19:44:29

标签: neo4j cypher

如何编写查询以获取与集合中所有节点有关系的节点。例如:

START n=node:people("username:*"), 
g=node:groups("groupname:A groupname:B") 
MATCH n-[:M]->g 
RETURN n

这将返回与A B有关系的用户。但我希望用户与A B有关系。我无法弄清楚如何做到这一点虽然。

编辑:

我需要为任意数量的组执行此操作,而不仅仅是A和B.我使用索引语法的原因是这是来自用户输入,所以它可能是这样的:

START n=node:people("username:*"), 
g=node:groups("groupname:*") 
MATCH n-[:M]->g 
RETURN n

我需要返回与所有组有M关系的用户。

2 个答案:

答案 0 :(得分:3)

START n=node:people("username:*"), 
g=node:groups("groupname:*") 
with n, collect(g) as groups
MATCH n-[:M]->ug
with n, collect(ug) as user_groups
where ALL(g in groups WHERE g in user_groups)
RETURN n

它甚至可以像这样工作(应该更快)

START n=node:people("username:*"), 
g=node:groups("groupname:*") 
with n, collect(g) as groups
MATCH n-[:M]->ug
WHERE ug in groups
with n, count(*) as found, length(groups) as group_count
WHERE found = group_count
RETURN n

答案 1 :(得分:0)

将A组和B组分成不同的变量,然后确保每个匹配单独存在。

START n=node:people("username:*"), 
gA=node:groups("groupname:A"),
gB=node:groups("groupname:B") 
MATCH n-[:M]->gA, n-[:M]->gB 
RETURN n