使用spring-data-neo4j,我想使用@RelationshipEntity(type =“OWNS”)创建两个类,将Person类链接到Pet和Car.
@RelationshipEntity(type="OWNS")
public class OwnsCar {
@Indexed
private String name;
@StartNode
private Person person;
@EndNode
private Car car;
}
@RelationshipEntity(type="OWNS")
public class OwnsPet {
@Indexed
private String name;
@EndNode
private Person person;
@StartNode
private Pet pet;
}
这样可以正确保存到图形数据库,没有任何问题,因为我可以查询实际的节点和关系并查看它们的类型等.
但是当我尝试使用@RelatedTo(type =“OWNS”,elementClass = Pet.class)时,我得到一个类强制转换异常,或者在使用延迟初始化时,我得到的结果不正确.
@NodeEntity
public class Person {
@Indexed
private String name;
@RelatedTo(type="OWNS",direction=Direction.OUTGOING,elementClass=Pet.class)
private Set
我尝试打印我的人时得到的结果(我的toString()已被省略,但它只是为每个字段调用toString())是这样的:
Person [nodeId=1,name=Nick,pets=[Car [nodeId=3,name=Thunderbird]],cars=[Car [nodeId=3,name=Thunderbird]]]
最佳答案
似乎问题是,注释导致springDataneo4j优先考虑关系名称.我在我创建的另一个样本上尝试了相同的操作如果两个注释都包含
type =“OWNS”它混合了两个’对象’.当我省略这些信息,只使用方向和类型时,它对我有用.
type =“OWNS”它混合了两个’对象’.当我省略这些信息,只使用方向和类型时,它对我有用.
不幸的是,如果您使用另一个与另一个注释相关的宠物或汽车的@RelatedTo注释,这将导致问题.由于“OWNS”与Pet-Type的任何其他关系之间没有区别,该集合返回所有相关宠物(例如:peter – >(HATES-Relationsip) – > dogs).
如果它是一个bug或不是,我不能告诉…但对于数据库:只有节点和关系.两者都没有输入,所以neo4j对你的’Pet’或’Car’-Class一无所知. Spring数据neo4j通过索引每个类型的所有节点并设置type-attribute,或使用特定的图形布局(带子引用)来处理这个问题.即使你想要获取具有遍历描述的人的所有宠物,你也会有更多的代码要编写,因为名称为’OWNS’的传出关系包含两种类型的对象.
我建议使用两个不同的名字.稍后编写自定义遍历/查询会更容易,也可能更快,因为不需要进行类型比较.有什么理由,为什么你需要这些特定的名字?
PS:有可能,并非一切都是100%准确.我不太详细了解springdataneo4j,但这是我到目前为止所知道的.