2017-08-01 152 views
1

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

(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

+0

问题中显示的查询有什么问题?什么是期望的输出? –

+0

我认为上面的查询不起作用,因为该技能的名称属性不是一个列表。因此,使用查询 s.name =“A”AND s.name =“B” 当然不会给数据库中的任何匹配。 我想获得具备这两项技能的用户。 –

+0

是的,你是对的。我在下面回答你的问题。 –

回答

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 

这个查询应该在一个更优雅的方式同样的工作。这样你可以把所有技能名称放在数组中。

+0

我明白了,那可以工作!非常感谢你!! 但是,有没有更有效的方法? 如果我想说,查询会是什么样的,比方说,找到一个拥有10个技能的用户? –

+0

@WilliamStefanHartono我编辑了我的答案。请尝试它! :) –

+0

@布鲁诺你的编辑不起作用,如果他想找到有A *和* B的用户。那找到有A *或* B的用户。 –

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; 
相关问题