У меня есть следующий Neo4j Cypher запрос для Decision
объекта удаления:Neo4j Cypher удалить запрос
MATCH (d:Decision)
WHERE id(d) IN {decisionsIds}
OPTIONAL MATCH (d)-[r]-(t)
DELETE d, r WITH t, r
WHERE NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-()
WHERE r2 <> r WITH t, r2
WHERE none(x in labels(t) WHERE x in ['User', 'Decision']) DELETE t, r2
Ранее я имел Vote
сущности с отношениями VOTED_ON
и VOTED_FOR
субъектами Criterion
и Decision
. Кроме того, Vote
имеет отношение CREATED_BY
к User
субъект.
Все прошло отлично.
Сегодня я изменил эту схему. Я ввел новый объект VoteGroup
. Теперь VoteGroup
вместо Vote
содержит отношения VOTED_ON
и VOTED_FOR
к лицам Criterion
и Decision
:
@NodeEntity
public class VoteGroup extends BaseEntity {
private static final String VOTED_ON = "VOTED_ON";
private final static String VOTED_FOR = "VOTED_FOR";
private final static String CONTAINS = "CONTAINS";
@GraphId
private Long id;
@RelatedTo(type = VOTED_FOR, direction = Direction.OUTGOING)
private Decision decision;
@RelatedTo(type = VOTED_ON, direction = Direction.OUTGOING)
private Criterion criterion;
@RelatedTo(type = CONTAINS, direction = Direction.OUTGOING)
private Set<Vote> votes = new HashSet<>();
private double avgVotesWeight;
private long totalVotesCount;
.....
}
Vote
лицо теперь выглядит следующим образом:
@NodeEntity
public class Vote extends BaseEntity {
private final static String CONTAINS = "CONTAINS";
private final static String CREATED_BY = "CREATED_BY";
@GraphId
private Long id;
@RelatedTo(type = CONTAINS, direction = Direction.INCOMING)
private VoteGroup group;
@RelatedTo(type = CREATED_BY, direction = Direction.OUTGOING)
private User author;
private double weight;
....
}
Пожалуйста, помогите мне изменить упомянутый Cypher запрос для того, чтобы удалите Votes
. После изменения моей схемы он теперь удаляет VoteGroups
(все в порядке), но не удаляет Votes
. Мне нужно удалить Votes
и отношения между Votes
и User
.
ОБНОВЛЕНО
Новый следующий запрос работает в настоящее время (по крайней мере, все мои тесты прошли):
MATCH (d:Decision)
WHERE id(d) IN {decisionsIds}
OPTIONAL MATCH (d)-[r]-(t)
DELETE d, r
WITH t, r
WHERE NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-()-[r3:CONTAINS]-(t2)
WHERE r2 <> r
WITH t, r2, t2, r3
WHERE none(x in labels(t)
WHERE x in ['User', 'Decision'])
DELETE t, r2, t2, r3
, но я до сих пор не уверен, что этот запрос 100% правильно ... Во всяком случае, я добавлю кучу тестов, чтобы проверить все.
Не могли бы вы также проверить этот вопрос? Особенно я не уверен, что удалил все отношения и не оставил мусор в базе данных.
Спасибо за ваш ответ! 'VoteGroup' и' Vote' - это не только объекты, связанные с 'Decision'. «Решение» также содержит дочернее «Решение» и определяет список «Критерий» и «Критерийгруппы». Они также должны быть удалены. Но «Пользователь» не следует удалять .. только отношения с ним. Исходный запрос в вопросе проделал хорошую работу, пока я не ввел новую «VoteGroup» и повторно связал «Vote» с этим объектом. Теперь 'VoteGroup' вместо' Vote' содержит отношения 'VOTED_ON' и' VOTED_FOR' для сущностей 'Criterion' и' Decision'. – alexanoid
Итак, прямо сейчас для пары «Критерий» и «Решение» у меня может быть одна «VoteGroup» и список «Vote», связанные с этой 'VoteGroup'. Раньше у меня был список 'Vote', и каждый из них был связан с парой' Criterion' и 'Decision' – alexanoid
К сожалению, запрос в этом ответе не работает должным образом – alexanoid