我正在使用Spring Data Neo4j 3.3.1.RELEASE與Neo4j服務器2.2.3。Spring Data Neo4j創建重複節點
我的問題是有一些節點是我的實體的重複,但只有索引屬性。
我的類看起來是這樣的
@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不能正確處理它?
謝謝。我發現爲了創建一個具有唯一約束的索引,我只需要用'@Indexed(unique = true)'註釋該字段。當我這樣做時,約束將被創建並且索引也將被創建。 –
不客氣。還請記住對您接受的答案進行投票。 – cybersam
我沒有投票。不幸的是它說我需要15個聲望才能顯示我的投票。 –