更具体地说,我想执行以下操作(如果有帮助,请使用 node/JS):
假设您有一个包含 3 个工作条件(“JavaScript”、“PHP”、“MySQL”)的列表。
我有一个图表设置,其中每个 Person
Node 都可以连接到许多 Skill
Node 。我希望能够运行一个查询,该查询将返回所有 Person
Node ,这些 Node 至少连接到查询中指定的一个和最多所有技能 Node ,然后按积极的数量排序每个用户拥有的连接。如果作业标准是变量,使此查询有效的最有效方法是什么?
这是我目前所拥有的。同样,这行得通,但如何使 OR
语句成为变量?
匹配 (n:Persons)-[r:KNOWS]-(x:Skill)
WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql'
返回不同的 n
计数(n)
按 COUNT(n) DESC 排序
最佳答案
您可以使用 IN
运算符来测试某个值是否与列表中的值匹配。
MATCH (n:Persons)-[:KNOWS]-(x:Skill)
WHERE x.name IN ['PHP', 'JavaScript', 'MySql']
RETURN n, COUNT(x) AS nSkills
ORDER BY nSkills DESC;
由于 return 子句使用 COUNT()
函数来计算 aggregate在 n
上,使用 DISTINCT n
是多余的,因此查询省略了 DISTINCT
。
注意:为了提高效率,您应该将列表作为 parameter 传递.例如,如果 needed_skills
是包含技能列表的参数,查询将如下所示:
MATCH (n:Persons)-[:KNOWS]-(x:Skill)
WHERE x.name IN {needed_skills}
RETURN n, COUNT(x) AS nSkills
ORDER BY nSkills DESC;
(列表参数的 Here is another example。)
关于javascript - neo4j - 查找与匹配 x 长度属性值列表的 Node 有关系的所有 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33926862/