Nic*_*las 6 spring neo4j spring-data-neo4j
使用spring-data-neo4j,我想创建两个类,@RelationshipEntity(type="OWNS")用于将Person类链接到a 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;
}
Run Code Online (Sandbox Code Playgroud)
这保存到图形数据库正常,没有任何问题,因为我可以查询的实际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;
}
Run Code Online (Sandbox Code Playgroud)
我尝试打印我的人时得到的结果(我toString()已被省略,但它只是调用toString()每个字段)是这样的:
Person [nodeId=1, name=Nick, pets=[Car [nodeId=3, name=Thunderbird]], cars=[Car [nodeId=3, name=Thunderbird]]]
Run Code Online (Sandbox Code Playgroud)
有谁知道如果可以做到这一点,应该做什么,只是一个错误或缺少的功能?
问题似乎是,注释导致 springDataNeo4j 优先考虑关系名称。我在我创建的另一个样本上尝试了同样的方法。如果两个注释都包含
type="OWNS"它会混合两个“对象”。当我省略这些信息,只使用方向和类型时,它对我有用。
不幸的是,如果您使用另一个 @RelatedTo 注释以及与另一个注释相关的更多宠物或汽车,这将导致问题。由于“OWNS”与宠物类型的任何其他关系之间没有区别,因此该集合返回所有相关宠物(例如:peter ->(HATES-Relationsip)->dogs)。
如果它是不是一个错误,我无法判断......但是对于数据库:只有节点和关系。两者都没有输入,因此 neo4j 不知道您的“宠物”或“汽车”类别的任何信息。Spring data neo4j 可以通过为每种类型的所有节点建立索引并设置类型属性,或者使用特定的图形布局(带有子引用)来处理此问题。即使您想通过遍历描述获取一个人的所有宠物,您也需要编写更多代码,因为名称为“OWNS”的传出关系包含两种类型的对象。
我建议使用两个不同的名称。稍后编写自定义遍历/查询会更容易,而且可能甚至更快,因为不需要类类型比较。您有什么理由需要这些特定名称吗?
PS:有可能并不是所有事情都是100%准确的。我不太了解 springdataneo4j 的细节,但这就是我到目前为止所了解的。
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |