2014-01-16 33 views
4

我這是由以下的Cypher表達式描述的圖:我描述了一個Java類匹配Brand「s的數據結構如何將實體映射到現有圖形?

CREATE 
(BMW:Brand {name: "BMW", country: "Germany"}), 
(X3:Model {name: "X3", acceleration: 7.1, maxSpeed: 227.5, displacement: 1997, consumption: 6}), 
(lastGen:Generation {from: 2013}), 
(xDrive20i:Modification {name: "xDrive20i", maxSpeed: 210, acceleration: 8.3, consumption: 7.9}), 
(X3)-[:MODEL_OF]->(BMW), 
(BMW)-[:MODEL]->(X3), 
(lastGen)-[:GENERATION_OF]->(X3), 
(X3)-[:GENERATION]->(lastGen), 
(xDrive20i)-[:MODIFICATION_OF]->(X3), 
(X3)-[:MODIFICATION]->(xDrive20i), 
(lastGen)-[:MODIFICATION]->(xDrive20i), 
(xDrive20i)-[:MODIFICATION_OF]->(lastGen); 

@NodeEntity 
@TypeAlias("Brand") 
public class Brand { 

    @GraphId 
    private Long id; 

    @Indexed(indexType = IndexType.FULLTEXT, indexName = "brand_name") 
    private String name; 

    private String origin; 

    private String owner; 

    @RelatedTo(type = "MODEL", direction = Direction.OUTGOING) 
    private Set<Model> models; 

    //getters and setters are ommited 
} 

和存儲庫:

public interface BrandRepository extends GraphRepository<Brand>{ 

    //method's signatures are ommited 

} 

當我撥打brandRepository.count()時,它會返回1,如我所料。但是,如果我叫brandRepository.getOne(2249L)我得到一個異常:

java.lang.IllegalStateException: No primary SDN label exists .. (i.e one with starting with __TYPE__) 

據我所知讀LabelBasedNodeTypeRepresentationStrategy源,節點必須有至少一個標籤與__TYPE__前綴。

我如何將實體映射到圖上,因爲我可能不會更改圖結構?

如果沒有其他方法,我不介意執行我自己的自定義LabelBasedNodeTypeRepresentationStrategy。但在這種情況下,有人可以讓我知道爲什麼它以這種方式實現(我認爲這不是偶然),我應該如何將自定義解決方案綁定到spring-data-neo4j使用它?

我使用neo4j-2.0.0-M06和spring-data-neo4j-3.0.0.M1。

+0

我沒有找到我的問題的答案,但我以另一種方式接近我的問題。我更改爲Ruby技術並使用[neo4j](https://github.com/andreasronge/neo4j)gem。它的行爲完全如我所料,至少不會將元數據添加到我的數據中。 –

回答

2

當您存儲實體時,SDN會爲您的圖形添加額外的元數據,您的情況下缺少元數據。

您可以嘗試通過調用

neo4jTemplate.postEntityCreation(node, Brand.class); 

添加元數據爲自己而是例如沒有索引你的名字字段(手工傳統指數)。

+0

謝謝你的回覆。這種方法使我有機會從使用Cypher表達式導入的數據獲取實體,但是它的價格是元數據更改數據。我不反對元數據,我反對用元數據來污染用戶空間。 –

+0

我可以通過任何方式避免數據中的元數據存在嗎?以及這將如何導致未來的麻煩? –

+1

@RandomFreeman是的,不要使用SDN,請使用[neo4j](http://docs.neo4j.org/chunked/stable/tutorials-java-embedded.html)。如果您需要SDN,元數據不會污染,因爲SDN需要元數據,因此您需要元數據。如果你不需要(和/或想要)任何SDN給你的任何東西,那就是污染,在這種情況下,如果這個「污染問題」對你來說很重要,那麼你應該直接使用java API。 – drewmoore