2015-08-14 159 views
2

我正在使用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註釋。如果我在相同的批註中使用了uniqueindexName,則只應用indexName,而不是約束。現在,如果我使用indexNameunique SDN可以創建其中一個,我必須通過Neo4j webconsole創建另一個,這很煩人。我知道在SDN 4.x.x索引維護不會成爲代碼的一部分,應該在外部處理。這是我們現在需要做的事情,因爲SDN 3.3.x不能正確處理它?

回答

4

indexNameindexType僅用於將限定legacy indexes(其現在已經過時),並unique僅用來定義唯一性約束爲schema indexes。這兩種索引類型是互斥的。

如果要施加唯一性約束,則只需使用unique即可。

+0

謝謝。我發現爲了創建一個具有唯一約束的索引,我只需要用'@Indexed(unique = true)'註釋該字段。當我這樣做時,約束將被創建並且索引也將被創建。 –

+0

不客氣。還請記住對您接受的答案進行投票。 – cybersam

+0

我沒有投票。不幸的是它說我需要15個聲望才能顯示我的投票。 –