2015-10-02 43 views
1

摘要: 隨着SDN4,我堅持10名對象,其中一半有相同的內容只有ID用它們所連接的不同。鏈接ID設置爲@Transient。儘管如此,兩個對象是使用相同的內容創建的,而不是具有兩個鏈接的對象。我怎樣才能避免這種行爲?春數據的Neo4j 4.0:創建重複節點,應該建立關係,而不是

詳細信息: 我們定義了兩個域對象,並通過CSV信息源,它們看起來如下:

域對象一個CSV:

key,name 
1,test1 
3,test3 

POJO答:

@Transient 
private int key;  
private String name; 

@Relationship(type = "HAS_CERTIFICATION", direction = "OUTGOING") 
private Set<B> bObject = new HashSet<>(); 

public void setName(String name) { 
    this.name = name; 
} 

@Relationship(type = "HAS_CERTIFICATION", direction = "OUTGOING") 
public void hasCertification(B b) { 
    bObject.add(b); 
    b.getA().add(this); 
} 

域對象B:

foreignKey,name,value 
1,ISO9001,TRUE 
1,ISO14001,TRUE 
3,ISO9001,TRUE 
3,ISO14001,TRUE 

POJO B:

@Transient 
private int foreignKey; 
private String name; 
private String value; 

@Relationship(type = "HAS_CERTIFICATION", direction = "INCOMING") 
private Set<A> a = new HashSet<>(); 

public void setName(String name) { 
    this.name = name; 
} 

public void setValue(String value) { 
    this.value = value; 
} 

@Relationship(type = "HAS_CERTIFICATION", direction = "INCOMING") 
public Set<A> getA() { 
    return a; 
} 

這些CSV文件被解析並在各自POJO的(A和B)加載到SDN4。現在

我們遍歷這些對象並添加關係:

private void aHasCertification(
     Optional<List<B>> b, 
     Optional<List<A>> a) { 
    for (A aObj : a()) { 
     for (B bObj : b()) { 
      if(bObj.getForeignKey() == aObj.getKey()) { 
       aObj.hasCertification(bObj); 
      } 
     } 
    } 
} 

然後根庫,repositoryA,用來保存加載的對象。 repositoryA.save(domainObjectA);

現在,當我查詢數據庫; match n return n;

對於每個A對象,都會有兩個ISO9001和兩個ISO14001對象。而不是我所期望的,其中每一個有兩個鏈接到A:1A:3

回答

1

如果我理解你正確地,而不是

enter image description here

你期待

enter image description here

OGM無法知道具有相同「名稱」的B的兩個實例是同一個節點。你需要做的是按屬性加載B節點,如果它存在,使用它來關聯到A,否則創建它。 我懷疑你需要進一步處理CSV數據,而不是用幾乎1:1映射到CSV行的建模對象。

+0

好的,回答了我的問題,它不會識別它只是由節點的內容重複。我必須事先做一些CSV處理。謝謝 –