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

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

inno setup - TLabel or TNewStaticText - change .Font.Style on Focus like Cursor changes with .Cursor -