【问题标题】:Spring Data Neo4j creates duplicate nodesSpring Data Neo4j 创建重复节点
【发布时间】:2015-11-07 05:38:35
【问题描述】:

我正在将 Spring Data Neo4j 3.3.1.RELEASE 与 Neo4j 服务器 2.2.3 一起使用。

我的问题是有些节点与我的实体重复,但其中只有索引属性。

我的班级看起来像这样

@NodeEntity
@TypeAlias("Product")
public class Product {
    @GraphId
    private Long graphId;
    @Indexed(indexName="productId", unique=true, indexType=IndexType.SIMPLE)
    private String productId;
    private String productType;
    ...
}

创建新节点时,我首先检查是否存在现有节点,如果存在则更新,否则创建新节点。

Product product = productRepository.findByProductId(productId);
if (product == null) {
    product = new Product(productId);
}
...
productRepository.save(product);

存储库接口。

public interface ProductRepository extends GraphRepository<Product> {
    public Product findByProductId(String productId);
}

在 Neo4j 中,实体被创建为具有所有属性的节点。但是有些节点也有一个重复的节点,它只包含 productId。问题是这不会发生在所有节点上。截至目前,我们有大约 120,000 个节点,并且多达 30 个节点具有此副本。每次我们重新摄取数据时,都会出现重复数据。现在我们只有 2 个重复节点。

还有一件事,在检查重复节点时,它们似乎有一个按顺序排列的节点 ID,我认为它们是在我保存实体时一起创建的。

编辑: 经调查,似乎唯一约束不适用于 productId。问题似乎来自@Indexed 注释。如果我在同一个注释中使用uniqueindexName,则只应用indexName 而不是约束。现在,如果我使用indexNameunique SDN 可以创建其中一个,我必须通过Neo4j webconsole 创建另一个,这有点烦人。我知道在 SDN 4.x.x 中,索引维护不是代码的一部分,应该在外部处理。由于 SDN 3.3.x 不能正确处理,我们现在需要这样做吗?

【问题讨论】:

    标签: neo4j spring-data spring-data-neo4j


    【解决方案1】:

    indexNameindexType 仅用于定义legacy indexes(现已弃用),unique 仅用于定义schema indexes 的唯一性约束。这两种索引类型是互斥的。

    如果你想施加唯一性约束,你只需要使用unique

    【讨论】:

    • 谢谢。我发现为了创建具有唯一约束的索引,我只需要使用@Indexed(unique=true) 注释该字段。当我这样做时,将创建约束并创建索引。
    • 不客气。还请记住对您接受的答案进行投票。
    • 我投了赞成票。不幸的是,它说我需要 15 个声望才能显示我的投票。
    • 好的,感谢您的尝试 :-) 看来其他人还是这样做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多