2015-11-25 31 views
1

更具体的属性值的列表,节点关系的所有节点,我想做到以下几点(使用节点/ JS,如果这是有帮助的):的Neo4j - 查找具有相匹配x长

假设你有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

回答

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; 

由于返回子句使用过nCOUNT()功能aggregate,它是多余的使用DISTINCT n,所以查询忽略DISTINCT

注意:为了提高效率,您应该将该列表作为parameter来传递。例如,如果needed_skills是含技能列表中的参数,查询将如下所示:(清单参数的Here is another example

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

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),所以它不包括他们拥有的技能数量。一旦计数完成,你只需要点菜,就像你已经做过的那样。