我得到了一个由以下 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
。但在这种情况下,有人可以让我知道为什么它以这种方式实现(我认为这不是偶然的)以及我应该如何将自定义解决方案绑定(bind)到 spring-data-neo4j
使用它?
我使用 neo4j-2.0.0-M06 和 spring-data-neo4j-3.0.0.M1。
最佳答案
当您存储实体时,SDN 会向您的图表添加额外的元数据,而您的案例中缺少该元数据。
您可以尝试通过调用自己添加该元数据
neo4jTemplate.postEntityCreation(node, Brand.class);
但是,例如,它不会为您的姓名字段编制索引(手动遗留索引)。
关于java - 如何将实体映射到现有图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21164451/