Spring Data Neo4j创建了重复的节点

时间:2015-08-14 03:54:21

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

我正在使用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无法正确处理它吗?

1 个答案:

答案 0 :(得分:4)

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

如果要强加唯一性约束,则只需使用unique