在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |