我应该如何编写查询以获得具有相同关系的多个节点?例如,使用图形模式
(u:user)-[r:USER_HAS_SKILL]->(s:skill)
我想让那些拥有,让我们说出技能的用户A'和技能' B'。 我当然不能这样做吗?
MATCH (u:user)-[r:USER_HAS_SKILL]->(s:skill)
WHERE s.name = "A" AND s.name = "B"
RETURN u.username
这里的图表用于查询:
答案 0 :(得分:2)
如果这是很多技能而且你不想明确地写出来,你可以做这样的事情。
WITH ['A', 'B', 'C', 'D', 'E'] AS skillset
MATCH (u:User)-[:USER_HAS_SKILL]->(s:Skill)
WHERE s.name IN skillset
WITH skillset, u, count(s) AS matches
WHERE matches = size(skillset)
RETURN u.username;
答案 1 :(得分:1)
您可以尝试这样的查询:
MATCH (skillA {name : "A"})
MATCH (skillB {name : "B"})
MATCH (u:user)
WHERE (u)-[:USER_HAS_SKILL]->(skillA)
AND (u)-[:USER_HAS_SKILL]->(skillB)
RETURN u.username
上面的查询与skillA
和skillB
相匹配。之后,WHERE
子句将保证只有匹配:USER_HAS_SKILL
与skillA
和skillB
的用户才能匹配。
修改强>
来自评论:
我知道,那可行!非常感谢你!!但是,还有更多 有效的方式?如果我愿意,那么查询会是什么样的,让我们说, 找到有10种技能的用户?
MATCH (s:skill) WHERE s.name IN ["A", "B"]
MATCH (u:user)-[:USER_HAS_SKILL]->(s)
RETURN u.username
此查询应以更优雅的方式进行相同的工作。这样您就可以将所有技能名称放在数组中。