加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在neo4j中删除具有单一关系的叶节点

发布时间:2020-12-14 04:51:32 所属栏目:百科 来源:网络整理
导读:我试图删除Neo4j中的叶节点,但只有那些具有单个传入关系的节点. (我很近.) 我有一个查询返回我想删除的确切节点.但是,当我用DELETE替换RETURN时,它会删除超过查询返回的内容.这是完整的序列: neo4j-sh (?)$match (n)-[r]-(p) return n,r,p ;+--------------
我试图删除Neo4j中的叶节点,但只有那些具有单个传入关系的节点. (我很近.)

我有一个查询返回我想删除的确切节点.但是,当我用DELETE替换RETURN时,它会删除超过查询返回的内容.这是完整的序列:

neo4j-sh (?)$match (n)-[r]->(p)  return n,r,p ;
+------------------------------------------------------------+
| n                    | r            | p                    |
+------------------------------------------------------------+
| Node[2164]{name:"a"} | :has[2616]{} | Node[2165]{name:"b"} |
| Node[2164]{name:"a"} | :has[2617]{} | Node[2166]{name:"c"} |
| Node[2166]{name:"c"} | :has[2619]{} | Node[2168]{name:"e"} |
| Node[2167]{name:"d"} | :has[2618]{} | Node[2165]{name:"b"} |
+------------------------------------------------------------+

这个查询很完美:

neo4j-sh (?)$match ()-[r:has]->(n)
>   with n,count(r) as rel_cnt
>   where rel_cnt = 1 and NOT (n)-->()
>   return n.name,rel_cnt;
+------------------+
| n.name | rel_cnt |
+------------------+
| "e"    | 1       |
+------------------+

但这删除删除了2个节点和3个关系?

neo4j-sh (?)$match ()-[r:has]->(n)
>   with n,count(r) as rel_cnt
>   where rel_cnt = 1 and NOT (n)-->()
>   delete n,r;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 2
Relationships deleted: 3

这就是剩下的一切

neo4j-sh (?)$match (n)-[r]->(p)  return n,p ;
+------------------------------------------------------------+
| n                    | r            | p                    |
+------------------------------------------------------------+
| Node[2164]{name:"a"} | :has[2617]{} | Node[2166]{name:"c"} |
+------------------------------------------------------------+
neo4j-sh (?)$match (n) return n;
+----------------------+
| n                    |
+----------------------+
| Node[2169]{name:"a"} |
| Node[2171]{name:"c"} |
| Node[2172]{name:"d"} |
+----------------------+

为什么删除节点’b’?它没有显示在查询结果中.

解决方法

即使除了RETURN / DELETE之外,查询实际上也不相同.返回查询携带n,count(r)到第二查询部分,删除查询携带n,count(r).尝试返回删除查询以查看它,即运行它

neo4j-sh (?)$match ()-[r:has]->(n)
>   with n,count(r) as rel_cnt
>   where rel_cnt = 1 and NOT (n)-->()
//>   delete n,r;
>   return *;

你会得到类似的东西

+-----------------------------------------------+
| n                    | r            | rel_cnt |
+-----------------------------------------------+
| Node[2165]{name:"b"} | :has[2616]{} | 1       |
| Node[2165]{name:"b"} | :has[2618]{} | 1       |
| Node[2168]{name:"e"} | :has[2619]{} | 1       |
+-----------------------------------------------+

产生不同结果的原因是管道n,count(r)意味着类似“count r per n”,并且只有一种情况是“count r per n = 1”.但是另一个管道意味着“计算每n和每r的数量”,如果你自己计算或分组,那么它每次都会成为一个.不删除某些内容的原因是它从未匹配或被其他过滤器标准(NOT(n) – >())排除,因此rel_cnt = 1无效.

如果要首先计算关系然后有条件地删除它们,可以收集它们,过滤集合大小,然后从集合中删除.尝试类似的东西

MATCH ()-[r:has]->(n)
WITH n,collect(r) as rr
WHERE length(rr) = 1 AND NOT n-->()
FOREACH (r IN rr | DELETE r)
DELETE n

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读