neo4j - 查找与节点关系的所有节点,这些节点匹配x长度的属性值列表

时间:2015-11-25 21:39:29

标签: javascript node.js neo4j

更具体地说,我想做以下事情(如果有帮助,请使用node / JS):

假设您有3个职位标准的列表(' JavaScript',' PHP',' MySQL')。

我有一个图表设置,其中每个Person节点可以连接到许多Skill个节点。我希望能够运行一个查询,该查询将返回与查询中指定的至少一个和最多所有技能节点有连接的所有Person个节点,然后按多少个正连接排序每个用户都有。如果作业标准是变量,那么使此查询有效的最有效方法是什么?

这是我到目前为止所拥有的。同样,这可行,但如何将OR语句变为变量?

MATCH (n:Persons)-[r:KNOWS]-(x:Skill) WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql' RETURN DISTINCT n COUNT(n) ORDER BY COUNT(n) DESC

2 个答案:

答案 0 :(得分:3)

您可以使用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。< / p>

注意:为了提高效率,您应该将列表作为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。)

答案 1 :(得分:0)

我不明白你的意思是“将OR语句变为变量”,但你可以使用ORDER BYCOUNT

来实现其他部分
MATCH (n:Persons)-[r:KNOWS]-(x:Skill)
WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql'
RETURN DISTINCT n, COUNT(r)
ORDER BY COUNT(r) DESC

你使用计数来计算(n)所以它没有计算他们拥有的技能数量。计数完成后,您只需要订购,就像您已经完成的那样。