【问题标题】:Neo4j Cypher delete queryNeo4j Cypher 删除查询
【发布时间】:2015-11-01 14:45:44
【问题描述】:

我对@9​​87654321@ 实体删除有以下 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_ONVOTED_FOR 与实体CriterionDecision 有关系。此外,VoteCREATED_BY 有关系 User 实体。

一切正常。

今天,我更改了此架构。我引入了新的VoteGroup 实体。 现在,VoteGroup 而不是 Vote 包含 VOTED_ONVOTED_FOR 与实体 CriterionDecision 的关系:

@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 以及VotesUser 之间的关系。

更新

下面的新查询现在可以工作了(至少我所有的测试都通过了):

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% 正确...无论如何,我将添加一堆测试以检查所有内容。

您能否也验证此查询? 尤其是我不确定删除了所有关系并没有在数据库中留下垃圾。

【问题讨论】:

    标签: neo4j cypher spring-data-neo4j graph-databases


    【解决方案1】:

    看起来很复杂。

    你不能只指定路径并删除整个路径吗?

    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
    

    【讨论】:

    • 感谢您的回答! VoteGroupVote 不仅是与 Decision 关联的实体。 Decision 还包含子 Decision 并定义 CriterionCriterionGroup 的列表。它们也必须被删除。但是User不应该被删除..只有与他的关系。在我引入新的VoteGroup 并将Vote 重新关联到该实体之前,问题中的原始查询做得很好。现在,VoteGroup 而不是 Vote 包含关系 VOTED_ONVOTED_FOR 到实体 CriterionDecision
    • 所以,现在对于一对CriterionDecision,我可以有一个VoteGroup 和一个Vote 列表与这个VoteGroup 相关联。以前我有一个Vote 列表,每个列表都与一对CriterionDecision 相关联
    • 不幸的是,这个答案中的查询没有按预期工作
    • 我创建了新查询(用它更新了我的问题)。你能也检查一下吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2021-10-30
    相关资源
    最近更新 更多