我使用Spring Data Neo4j 3.3.1.RELEASE和Neo4j服务器2.2.3 .
我的问题是有些节点是我的实体的重复,但只有索引属性 .
我的 class 看起来像这样
@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无法正确处理它吗?
1 回答
indexName
和indexType
仅用于定义legacy indexes(现已弃用),unique
仅用于定义schema indexes的唯一性约束 . 两种索引类型是互斥的 .如果要强加唯一性约束,则只需使用
unique
.