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

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

假设你有一个3个工作标准('JavaScript','PHP','MySQL')的列表。

我有一个graphics设置,其中每个Person节点可以连接到许多Skill节点。 我希望能够运行一个查询,该查询将返回至less有一个连接到查询中指定的所有技能节点的所有Person节点,然后按每个用户有多less正面连接进行sorting。 如果作业标准是一个variables,那么使这个查询工作的最有效的方法是什么?

这是我到目前为止。 再次,这工作,但我如何使OR语句variables?

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

您可以使用IN运算符来testing值是否与列表中的值匹配。

 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()函数对n进行聚合 ,因此使用DISTINCT n是多余的,因此查询省略了DISTINCT

注意:为了提高效率,您应该将该列表作为parameter passing。 例如,如果needed_skills是包含技能列表的参数,则查询如下所示:

 MATCH (n:Persons)-[:KNOWS]-(x:Skill) WHERE x.name IN {needed_skills} RETURN n, COUNT(x) AS nSkills ORDER BY nSkills DESC; 

( 这是另一个列表参数的例子 。)

我不明白你的意思是“使OR语句变成一个variables”,但是你可以使用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 

你用count来计数(n),所以它不包括他们拥有的技能数量。 一旦计数完成,你只需要订购,就像你已经做了。