2016-12-05 157 views
0

我正在學習Neo4j並通過spring-data-neo4j使用它,但我努力使它適合我的需求。JSON to @RelationshipEntity(通過Spring Boot)

基本上我想來表示:

A -[{...relationshipKey}]-> B 

即A包含地圖的BS,以及在地圖上的每個鍵由屬性relationshipKey表示。我這樣做是因爲AFAIU Neo4J不可能存儲地圖。

所以我用@RelationshipEntity這樣的:

@Data 
@NodeEntity 
class A { 
    @Relationship(type = "CONTAINS_B") 
    Set<ContainsB> containsB; 
} 

@RelationshipEntity(type = "CONTAINS_B") 
@Data 
class ContainsB { 
    @GraphId Long id; 
    @StartNode A a; 
    @EndNode B b; 
    @Property RelationshipKey relationshipKey; // an enum 
} 

@Data 
@NodeEntity 
class B { 
    // Whatever 
} 

我試圖用彈簧啓動控制器,而我傳遞一個JSON保存新圖。

控制器:

@PostMapping(value = BASE_PATH + "/create") 
A createA(@RequestBody @NonNull A a) { 
    return ARepository.save(a); 
} 

JSON:

{ 
    "containsB": [{ 
     "relationshipKey": "key1", 
     "b": {"someB": "properties"} 
    },{ 
     "relationshipKey": "key2", 
     "b": {"someB": "different properties"} 
    }] 
} 

然而,當我調用控制器,我得到這個異常:

org.neo4j.ogm.exception.MappingException:關係實體A(...) 不能缺少開始或結束節點

當我調試控制器調用時,a.getContainsB().iterator().next().getA()爲空,但a.getContainsB().iterator().next().getB()已實例化並具有正確的屬性。

如果我的倉庫保存之前做到這一點的話,就好像工作正常,而A和B是正確的關係:

a.getContainsB().iterator().next().setA(new A()) 

有沒有辦法通過將由Neo4j的正確解釋的JSON ?

回答

0

原因你的JSON被定義與兩個關係「ContainsB」,這是由在領域模型中一個@RelationshipEntity表示的實例的錯誤

。但是,JSON中「ContainsB」的定義本身不包含對其包含的引用,所以當創建每個包含B時,它沒有引用A

解決方案

有一對夫婦的事情,你可以嘗試。

最明顯的一個是創建「ContainsB」,而不是實例:

{ 
    "relationshipKey": "key1", 
    "a": { ... }, 
    "b": { ... } 
} 

另一種選擇是使用JSON生成器,允許你創建對象引用,並在你的定義內部引用它們。 JSOG格式可以讓你做到這一點,並與傑克遜兼容。有關更多詳情,請參閱https://github.com/jsog/jsog