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
请如果有人可以指导或纠正我哪里出错了,您的帮助将不胜感激。提前致谢。
解决方案
确保在使用 count 或其他聚合函数时,它们位于 WITH 子句或 RETURN 子句中 - 这似乎是 Neo Technology 在创建 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
推荐阅读
- jekyll - Jekyll 将文件添加到 _site 没有扩展名
- node.js - 我想以 jwt 方式使用 gmail api
- flutter - Flutter 中的约束布局等价物是什么?
- xml - XML 站点地图呈现为纯文本
- sql-server - ASP.Net MVC - 如何从一个数据库中的两个表中保存和检索数据
- java - Spring RestTemplate 和 Spock 测试修改日期?
- c# - 我不能在 C# 中使用语音识别。为什么?
- python - 大于符号的无效语法错误
- c# - MVC 使用“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找不到任何构造函数
- java - 对此使用不同的顺序时,我的 EnableRetrofitClients 自定义注释的原因是什么