cypher - Delete leaf nodes with single relationship in neo4j -
i trying remove leaf nodes in neo4j, single incoming relationship. (i'm close.)
i have query returns exact node wish remove. however, when replace return delete, removes more query returns. here's complete sequence:
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"} | +------------------------------------------------------------+
this query perfect:
neo4j-sh (?)$ match ()-[r:has]->(n) > n,count(r) rel_cnt > rel_cnt = 1 , not (n)-->() > return n.name, rel_cnt; +------------------+ | n.name | rel_cnt | +------------------+ | "e" | 1 | +------------------+
but delete removed 2 nodes , 3 relationships?
neo4j-sh (?)$ match ()-[r:has]->(n) > n, r, count(r) rel_cnt > rel_cnt = 1 , not (n)-->() > delete n, r; +-------------------+ | no data returned. | +-------------------+ nodes deleted: 2 relationships deleted: 3
this that's left
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"} | +----------------------+
why node 'b' removed? didn't show in query results.
the queries not identical apart return/delete
. return query carries n, count(r)
second query part, delete query carries n, r, count(r)
. try returning delete query see that, i.e. run this
neo4j-sh (?)$ match ()-[r:has]->(n) > n, r, count(r) rel_cnt > rel_cnt = 1 , not (n)-->() //> delete n, r; > return *;
and you'll like
+-----------------------------------------------+ | 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 | +-----------------------------------------------+
the reason different result piping n, count(r)
means "count r per n", , there 1 case "count r per n = 1". other pipe means "count r per n , per r" , if count or group itself, it's going 1 every time. reason not deleted never matched or excluded other filter critera (not (n)-->()
), rel_cnt=1
rendered useless.
if want first count relationships , conditionally delete them, can collect them, filter on collection size, , delete collection. try like
match ()-[r:has]->(n) n, collect(r) rr length(rr) = 1 , not n-->() foreach (r in rr | delete r) delete n
Comments
Post a Comment