neo4j - удалить узел после удаления отношения, если отношения = 0 - PullRequest
1 голос
/ 07 мая 2019

Давайте возьмем этот пример: у меня есть набор данных с убийцами, которые убивали друг друга.У нас есть murderer-killed->murderer.

 neo4jClient.Cypher
.Match("(murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
.Where((MurdererNode murderer1) => murderer1.Name == "someName")
.AndWhere((MurdererNode murderer2) => murderer2.Name == "someName2")
.Delete("k")

Теперь, в моем приложении, я передаю некоторые параметры и удаляю «убитые» отношения между двумя узлами.Может случиться так, что ни один из узлов не будет иметь никаких входящих или убитых отношений сразу после выполнения удаления.Только в этом случае, т.е. когда оба входящих и исходящих равны 0, я хочу удалить узел из моей базы данных.

После удаления отношения я хочу выполнить «IF node.out_relationship.count = 0 и узел.in_relationship.count = 0, затем «УДАЛИТЬ узел» для обоих узлов, участвующих в отношении.Другими словами, я хочу выполнить некоторую работу по удалению связей на своих узлах.

Я думал улучшить свой запрос следующим образом:

 neo4jClient.Cypher
.Match("(murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
.Where((MurdererNode murderer1) => murderer1.Name == "someName")
.AndWhere((MurdererNode murderer2) => murderer2.Name == "someName2")
.Delete("k")
.With("murderer1,murderer2")
.Match("(murderer1)-[:KILLED]-()")
.Where("count(murderer1)=0")
.Delete(murderer1)
.Match("(murderer2)-[:KILLED]-()")
.Where("count(murderer2)=0")
.Delete(murderer2)

(Очевидно, я мог разбитьзапросы в другие сеансы, но я думаю, что хранение всего в одном сеансе, повторное использование узла, было бы более эффективным.)

В любом случае, я не уверен, какой смысл имеет это изменение, оно выглядит уродливо, и этоТакое чувство, что я наклоняюсь назад.

Как я могу продолжить?Буду признателен за любую помощь.Спасибо.

1 Ответ

0 голосов
/ 07 мая 2019

Поскольку ваша логика для убийцы1 и убийцы2 идентична, если вы создадите список из двух элементов для обоих убийц, а затем СДЕЛАЕТЕ их для одной переменной, вы можете применить эту логику к обоим сразу.

Сайфер для этого будет:

MATCH (murderer1:MurdererNode)-[k:KILLED]->(murderer2:MurdererNode)
WHERE murderer1.Name = "someName"
 AND murderer2.Name = "someName2"
DELETE k
WITH [murderer1, murderer2] as murderers
UNWIND murderers as murderer // now each on its own row under "murderer"
WITH murderer
WHERE size((murderer)-[:KILLED]-()) = 0
DETACH DELETE murderer // will delete any additional relationships

Вы также можете использовать FOREACH (поверх отфильтрованной коллекции 2 убийц, где: KILLED степень равна 0) и выполнять УДАЛИТЬ DETACH вместо использования UNWIND.

Я не совсем уверен, как это можно выразить с помощью neo4jclient, но это должен быть план, который вы можете использовать для работы над этим.

...