首页 > 解决方案 > 如何通过对值使用聚合函数来删除节点和关系

问题描述

我第一次使用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

请如果有人可以指导或纠正我哪里出错了,您的帮助将不胜感激。提前致谢。

标签: neo4j

解决方案


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

Neo4j中如何计算关系的数量

Neo4j 聚合函数

我需要计算具有特定属性的两个节点之间的连接数

另外 - 请参阅此处的 WITH 子句文档此处的 RETURN 子句文档,特别是 WITH 文档的这一部分:

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

在您的情况下,您将希望在 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 

推荐阅读