我正在使用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注释。如果我在同一注释中使用unique
和indexName
,则仅应用indexName
而不是约束。现在,如果我使用indexName
或unique
SDN可以创建其中一个,我必须通过Neo4j webconsole创建另一个,这有点烦人。我知道在SDN 4.x.x中,索引维护不是代码的一部分,应该在外部处理。这是我们现在需要做的事情,因为SDN 3.3.x无法正确处理它吗?
答案 0 :(得分:4)
indexName
和indexType
仅用于定义legacy indexes(现已弃用),unique
仅用于定义{{3}的唯一性约束}。两种索引类型是互斥的。
如果要强加唯一性约束,则只需使用unique
。