Neo4J删除所有深度相关的节点

时间:2014-10-03 16:41:13

标签: neo4j

如何使用某些属性删除主节点的所有深度相关节点,例如“Trojańska”

CREATE (spol:Spoldzielnia { value : 'Poludnie' })
CREATE (mT:Home { value : 'Trojanska' })
CREATE (mR:Home { value : 'Renesansowa' })
CREATE (mK:Home { value : 'Kasandry' })
CREATE (pS:Person { value : 'Slawek' })
CREATE (pR:Person { value : 'Remek' })
CREATE (pW:Person { value : 'Wojtek' })
CREATE (pK:Person { value : 'Krzychu' })
CREATE (pB:Person { value : 'Bolek' })
CREATE (pC:Person { value : 'Czesław' })
CREATE (pTT:Person { value : 'Tosiek' })
CREATE (pZZ:Person { value : 'Zbychu' })
CREATE (pWW:Person { value : 'Wlodek' })
CREATE (pFF:Person { value : 'Franko' })
CREATE (pMM:Person { value : 'Mietek' })
CREATE (i01:Item { value : 'telefon'})
CREATE (i02:Item { value : 'komputer'})
CREATE (i03:Item { value : 'laptop'})
CREATE (i04:Item { value : 'telefon'})
CREATE (i05:Item { value : 'komputer'})
CREATE (i06:Item { value : 'laptop'})
CREATE (i07:hardware { value : 'modem'})
CREATE (i08:option { value : 'wifi'})
CREATE (i09:option { value : 'usb'})
CREATE (mT)-[:HAS]->(spol)
CREATE (mR)-[:HAS]->(spol)
CREATE (mK)-[:HAS]->(spol)
CREATE (pS)-[:HAS]->(mT)
CREATE (pR)-[:HAS]->(mT)
CREATE (pW)-[:HAS]->(mT)
CREATE (pK)-[:HAS]->(mR)
CREATE (pB)-[:HAS]->(mR)
CREATE (pC)-[:HAS]->(mR)
CREATE (pTT)-[:HAS]->(mK)
CREATE (pZZ)-[:HAS]->(mK)
CREATE (pWW)-[:HAS]->(mK)
CREATE (pFF)-[:HAS]->(mK)
CREATE (pMM)-[:HAS]->(mK)
CREATE (i01)-[:HAS]->(pS)
CREATE (i02)-[:HAS]->(pS)
CREATE (i03)-[:HAS]->(pS)
CREATE (i04)-[:HAS]->(pR)
CREATE (i05)-[:HAS]->(pR)
CREATE (i06)-[:HAS]->(pR)
CREATE (i07)-[:HAS]->(i02)
CREATE (i08)-[:HAS]->(i07)
CREATE (i09)-[:HAS]->(i06)

示例我想删除与'Trojanska'相关的所有节点以及我想得到的结果:

Delete: Trojanska
Delete: Trojanska -> Slawek
Delete: Trojanska -> Slawek -> telefon
Delete: Trojanska -> Slawek -> komputer
Delete: Trojanska -> Slawek -> komputer -> modem
Delete: Trojanska -> Slawek -> komputer -> modem -> wifi
Delete: Trojanska -> Slawek -> laptop
Delete: Trojanska -> Wojtek
Delete: Trojanska -> Remek -> telefon
Delete: Trojanska -> Remek -> komputer
Delete: Trojanska -> Remek -> laptop
Delete: Trojanska -> Remek -> laptop -> usb

1 个答案:

答案 0 :(得分:1)

首先,在Neo中没有级联删除的概念(或者至少我认为没有)所以你必须手动执行它。使用我昨天设置的Console,运行查询:

MATCH (h:Home { value:"Trojanska" })<-[rs:HAS*]-(x)
FOREACH (r IN rs | 
     DELETE r)
DELETE x

您必须删除关系才能删除在FOREACH循环中完成的节点,然后是目标节点x。

确实不认为您可以返回路径,但这似乎可以工作并产生类似您想要的输出(假设您将始终使用value标记任何类型的节点):

MATCH p=(h:Home { value:"Trojanska" })<-[rs:HAS*]-(x)
WITH p, x, EXTRACT(x IN NODES(p)| x.value) AS nodes
FOREACH (n IN rels(p)| 
     DELETE n)
DELETE x
RETURN nodes

基本上所有这些额外的功能是使用Extract函数将String值拉出到一个数组中,然后可以返回,因为Strings没有绑定到它们的源节点(已被删除)。