我试图删除Neo4j中的叶节点,但只有那些具有单个传入关系的节点. (我很近.) 我有一个查询返回我想删除的确切节点.但是,当我用DELETE替换RETURN时,它会删除超过查询返回的内容.这是完整的
我有一个查询返回我想删除的确切节点.但是,当我用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, r, 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, r, 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,r,count(r).尝试返回删除查询以查看它,即运行它neo4j-sh (?)$match ()-[r:has]->(n) > with n, r, 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