如何通过对值使用聚合函数来删除节点和关系

时间:2018-07-10 07:21:18

标签: neo4j

我第一次使用neo4j,并且使用这样的交互式数据库很有趣,但是目前我陷入了一个难题,我有一个人的数据(uid,名字,姓氏,技能),我也有关系[:has_skill] 我的结果框架看起来像-p1具有技能s(罗伯特具有技能java) 我需要找出有多少人具有共同的技能,所以我尝试了以下密码查询

match (p1:People)-[:has_skill]->(s:Skill)<-[:has_skill]-(p2:People) where p1.people_uid="49981" and p2.people_uid="34564" return p1.first_name+' '+p1.last_name as Person1, p2.first_name+' '+p2.last_name as Person2,s.skill_name,s.skillid,count(s)

我将p1设置为不同的人,但是由于技能高昂,p2的人越来越多,而且技能没有变化,因此我尝试删除人的技能数量大于该值的每个节点和关系6获得良好的结果,但无法将其删除,我得到的是“无效使用聚合功能” 这是我尝试删除

match (p1:People)-[:has_skill]->(s:Skill) where count(s)>6 detach delete p1,s

如果有人可以指导或纠正我要去哪里出问题,请给予高度的帮助。预先感谢。

1 个答案:

答案 0 :(得分:1)

确保在使用count或其他聚合函数时,它们位于WITH子句或RETURN子句中-似乎是Neo Technology在创建Neo4j时做出的设计决定-有关与您类似的情况,请参见以下一些链接:

  

How to count the number of relationships in Neo4j

     

Neo4j aggregate function

     

I need to count the number of connection between two nodes with a certain property

还-请参见WITH子句文档here和RETURN子句文档here,尤其是WITH文档的这一部分:

  

另一种用途是过滤汇总值。 WITH用于引入聚合,然后可以在WHERE中的谓词中使用。这些聚合表达式在结果中创建新的绑定。与RETURN一样,WITH也可以使用别名作为绑定名称将别名表达式引入结果中。

在您的情况下,您将希望在WITH子句中使用聚合函数,因为之后需要使用WHERE来仅过滤那些具有6种以上技能的人。您可以使用以下查询来查看哪些人具有6种以上的技能:

match (p1:People)-[r:has_skill]->(s:Skill)
with p1,count(s) as rels, collect (s) as skills
where rels > 6
return p1,rels,skills

在确认结果集正确之后,可以使用以下查询删除具有6个以上技能的人员以及这些人员与之相关的所有技能节点:

MATCH(p1:People)-[r:has_skill]->(s:Skill)
WITH p1,count(s) as rels, collect (s) as skills
WHERE rels > 6
FOREACH(s in skills | DETACH DELETE s)
DETACH DELETE p1