如何将实体映射到现有图表?

时间:2014-01-16 14:26:35

标签: java spring neo4j spring-data-neo4j

我得到了一个图表,该图表由以下Cypher表达式描述:

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);

我描述了一个与Brand的数据结构匹配的java类:

@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。

1 个答案:

答案 0 :(得分:2)

当您存储实体时,SDN会向您的图表添加额外的元数据,而您的案例中缺少元数据。

您可以尝试通过调用

自行添加元数据
neo4jTemplate.postEntityCreation(node, Brand.class);

但是,例如,它不会索引您的名称字段(手动旧版索引)。