2015-08-09 3 views
0

У меня есть следующий 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% правильно ... Во всяком случае, я добавлю кучу тестов, чтобы проверить все.

Не могли бы вы также проверить этот вопрос? Особенно я не уверен, что удалил все отношения и не оставил мусор в базе данных.

ответ

0

Выглядит довольно сложно.

Не можете ли вы указать путь и удалить весь путь?

MATCH (d:Decision) WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH path = (d)-[r1:VOTED_ON|:CREATED_BY|:VOTED_FOR]->(t)<-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-() 
DELETE path 

// or 
DELETE d,t,r1,r2 
+0

Спасибо за ваш ответ! 'VoteGroup' и' Vote' - это не только объекты, связанные с 'Decision'. «Решение» также содержит дочернее «Решение» и определяет список «Критерий» и «Критерийгруппы». Они также должны быть удалены. Но «Пользователь» не следует удалять .. только отношения с ним. Исходный запрос в вопросе проделал хорошую работу, пока я не ввел новую «VoteGroup» и повторно связал «Vote» с этим объектом. Теперь 'VoteGroup' вместо' Vote' содержит отношения 'VOTED_ON' и' VOTED_FOR' для сущностей 'Criterion' и' Decision'. – alexanoid

+0

Итак, прямо сейчас для пары «Критерий» и «Решение» у меня может быть одна «VoteGroup» и список «Vote», связанные с этой 'VoteGroup'. Раньше у меня был список 'Vote', и каждый из них был связан с парой' Criterion' и 'Decision' – alexanoid

+0

К сожалению, запрос в этом ответе не работает должным образом – alexanoid

Смежные вопросы