使用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;
}
这可以正确保存到图表数据库,没有任何问题,因为我可以查询实际的Node
和Relationship
并查看它们类型等。
但是当我尝试使用@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<Pet> pets;
@RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Car.class)
private Set<Car> cars;
}
我尝试打印我的人时得到的结果(我的toString()
已被省略,但它只是为每个字段调用toString()
)是这样的:
Person [nodeId=1, name=Nick, pets=[Car [nodeId=3, name=Thunderbird]], cars=[Car [nodeId=3, name=Thunderbird]]]
是否有人知道是否可以这样做,应该完成,只是一个错误或缺少的功能?
答案 0 :(得分:3)
似乎问题是,注释导致springDataNeo4j优先考虑关系名称。我在我创建的另一个样本上尝试了相同的操作如果两个注释都包含
type="OWNS"
它混合了两个'对象'。当我省略这些信息,只使用方向和类型时,它对我有用。
不幸的是,如果您使用另一个与另一个注释相关的宠物或汽车的@RelatedTo注释,这将导致问题。由于“OWNS”与任何其他与宠物类型的关系没有区别,该套装会返回所有相关宠物(例如:彼得 - >(HATES-Relationsip) - >狗)。
如果它是一个bug或者不是,我说不出来......但是对于数据库:只有节点和关系。两者都没有输入,所以neo4j对你的'Pet'或'Car'-Class一无所知。 Spring数据neo4j通过索引每个类型的所有节点并设置type-attribute,或使用特定的图形布局(带子引用)来处理这个问题。即使你想要获取具有遍历描述的人的所有宠物,你也会有更多的代码要编写,因为名称为'OWNS'的传出关系包含两种类型的对象。
我建议使用两个不同的名字。稍后编写自定义遍历/查询会更容易,也可能更快,因为不需要进行类型比较。有什么理由,为什么你需要这些特定的名字?
PS:有可能,并非一切都是100%准确。我不太详细了解springdataneo4j,但这是我到目前为止所知道的。