У меня есть узлы, которые представляют документы, и узлы, которые представляют сущности. На объекты можно ссылаться в документе, если это так, они связаны друг с другом таким отношением:
(doc)<-[:IS_REFERENCED_IN]-(entity)
На один и тот же объект можно ссылаться в нескольких документах, а документ может ссылаться на несколько объектов.
Я хотел бы удалить для данного документа все объекты, на которые есть ссылки в этом данном документе Только.
Я думал о двух разных способах сделать это. Первый использует java для создания foreach и в основном будет примерно таким:
List<Entity> entities = MATCH (d:Document {id:0})<-[:IS_REFERENCED_IN]-(e:Entity) return e
for (Entity entity : entities){
MATCH (e:Entity)-[r:IS_REFERENCED_IN]->(d:Document) WITH *, count(r) as nb_document_linked WHERE nb_document_linked = 1 DELETE e
}
Этот метод будет работать, но я бы не хотел использовать код foreach или java для его создания. Я хотел бы сделать это в одном шифрованном запросе. Второй использует только один шифрованный запрос, но не работает. Это что-то вроде этого:
MATCH (d:Document {id:0})<-[:IS_REFERENCED_IN]-(e:Entity)-[r:IS_REFERENCED_IN]->(d:Document) WITH *, count(r) as nb_document_linked WHERE nb_document_linked = 1 DELETE e
Проблема здесь в том, что nb_document_linked не уникальна для каждой сущности, это уникальная переменная для всех сущностей, что означает, что она будет учитывать все отношения каждой сущности, чего я не хочу.
Итак, как я могу сделать своего рода foreach в моем шифрованном запросе, чтобы он работал?
Извините за мой английский, я надеюсь, что вопрос ясен, если вам нужна какая-либо информация, пожалуйста, спросите меня.





Вы можете сделать что-то вроде:
MATCH (d:Document{key:1})<-[:IS_REFERENCED_IN]-(e:Entity)
WITH e
MATCH (d:Document)<-[:IS_REFERENCED_IN]-(e)
WITH COUNT (d) AS countD, e
WHERE countD=1
DETACH DELETE e
Что вы можете увидеть, работая с этими примерами данных:
MERGE (a:Document {key: 1})
MERGE (b:Document {key: 2})
MERGE (c:Document {key: 3})
MERGE (d:Entity{key: 4})
MERGE (e:Entity{key: 5})
MERGE (f:Entity{key: 6})
MERGE (g:Entity{key: 7})
MERGE (h:Entity{key: 8})
MERGE (i:Entity{key: 9})
MERGE (j:Entity{key: 10})
MERGE (k:Entity{key: 11})
MERGE (l:Entity{key: 12})
MERGE (m:Entity{key: 13})
MERGE (d)-[:IS_REFERENCED_IN]-(a)
MERGE (e)-[:IS_REFERENCED_IN]-(a)
MERGE (f)-[:IS_REFERENCED_IN]-(a)
MERGE (g)-[:IS_REFERENCED_IN]-(a)
MERGE (d)-[:IS_REFERENCED_IN]-(b)
MERGE (e)-[:IS_REFERENCED_IN]-(b)
MERGE (f)-[:IS_REFERENCED_IN]-(c)
MERGE (g)-[:IS_REFERENCED_IN]-(c)
MERGE (j)-[:IS_REFERENCED_IN]-(a)
MERGE (h)-[:IS_REFERENCED_IN]-(a)
MERGE (i)-[:IS_REFERENCED_IN]-(a)
MERGE (g)-[:IS_REFERENCED_IN]-(c)
MERGE (k)-[:IS_REFERENCED_IN]-(c)
MERGE (l)-[:IS_REFERENCED_IN]-(c)
MERGE (m)-[:IS_REFERENCED_IN]-(c)
На котором он удаляет 3 Сущности.
Первый MATCH находит объекты, прикрепленные к вашему входному документу, а второй MATCH находит количество документов, к которым подключен каждый из этих объектов.