Neo4j查询具有相同关系的多个节点

时间:2017-08-01 17:08:39

标签: graph neo4j cypher

我应该如何编写查询以获得具有相同关系的多个节点?例如,使用图形模式

(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

这里的图表用于查询:

Example of graph

2 个答案:

答案 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

上面的查询与skillAskillB相匹配。之后,WHERE子句将保证只有匹配:USER_HAS_SKILLskillAskillB的用户才能匹配。

修改

来自评论:

  

我知道,那可行!非常感谢你!!但是,还有更多   有效的方式?如果我愿意,那么查询会是什么样的,让我们说,   找到有10种技能的用户?

MATCH (s:skill) WHERE s.name IN ["A", "B"]
MATCH (u:user)-[:USER_HAS_SKILL]->(s)
RETURN u.username

此查询应以更优雅的方式进行相同的工作。这样您就可以将所有技能名称放在数组中。