Graph Neo4j查询到具有相同关系的多个节点
我应该如何编写查询以获得具有相同关系的多个节点?例如,使用图形模式Graph Neo4j查询到具有相同关系的多个节点,graph,neo4j,cypher,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 下面是我用来查询的图表: 您可以尝试以下查询: MATCH (skil
(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
下面是我用来查询的图表:
您可以尝试以下查询:
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_拥有与skillA和skillB相关的技能
编辑:
从评论中:
我明白了,那可能有用!非常感谢你!!但是,还有更多吗 有效的方法?如果我想,比如说, 找到一个拥有10项技能的用户
这个查询应该以更优雅的方式完成同样的工作。这样,您可以将所有技能名称放入数组。您可以尝试以下查询:
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_拥有与skillA和skillB相关的技能
编辑:
从评论中:
我明白了,那可能有用!非常感谢你!!但是,还有更多吗 有效的方法?如果我想,比如说, 找到一个拥有10项技能的用户
这个查询应该以更优雅的方式完成同样的工作。通过这种方式,您可以将所有技能名称放入数组。如果有许多技能,而您不想显式写出它们,您可以这样做
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;
如果有很多技能,你不想把它们写出来,你可以这样做
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;
问题中显示的查询有什么问题?期望的输出是什么?我认为上面的查询不起作用,因为技能的name属性不是列表。因此,使用查询s.name=A和s.name=B当然不会在数据库中提供任何匹配项。我想得到同时具备这两种技能的用户。是的,你说得对。我在下面回答了您的问题。问题中显示的查询有什么问题?期望的输出是什么?我认为上面的查询不起作用,因为技能的name属性不是列表。因此,使用查询s.name=A和s.name=B当然不会在数据库中提供任何匹配项。我想得到同时具备这两种技能的用户。是的,你说得对。我在下面回答了你的问题。我明白了,那可能行得通!非常感谢你!!但是,还有更有效的方法吗?如果我想,比如说,找到一个拥有10项技能的用户,那么这个查询会是什么样的?@WilliamStefanHartono我编辑了我的答案。请试一试@Bruno如果他想找到同时拥有A和B的用户,则您的编辑不起作用。这会找到拥有A或B的用户。是的,这是我下面的答案:抱歉@NicoleWhite,我提到你试图提及问题的作者。此外,我没有注意到,并张贴了一个语义相当于您的答案的查询。这不是目的。我的错误。我将回滚编辑。我明白了,这可能有效!非常感谢你!!但是,还有更有效的方法吗?如果我想,比如说,找到一个拥有10项技能的用户,那么这个查询会是什么样的?@WilliamStefanHartono我编辑了我的答案。请试一试@Bruno如果他想找到同时拥有A和B的用户,则您的编辑不起作用。这会找到拥有A或B的用户。是的,这是我下面的答案:抱歉@NicoleWhite,我提到你试图提及问题的作者。此外,我没有注意到,并张贴了一个语义相当于您的答案的查询。这不是目的。我的错误。我将回滚编辑。