Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph Neo4j查询到具有相同关系的多个节点_Graph_Neo4j_Cypher - Fatal编程技术网

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,我提到你试图提及问题的作者。此外,我没有注意到,并张贴了一个语义相当于您的答案的查询。这不是目的。我的错误。我将回滚编辑。