spring - 具有相同类型的多个关系类

标签 spring neo4j spring-data-neo4j

使用 spring-data-neo4j,我想使用 @RelationshipEntity(type="OWNS") 创建两个类链接 Person类到两个 PetCar .

@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;
}

这正确地保存到图形数据库没有问题,因为我可以查询实际 NodeRelationship看看他们 类型 , 等等。

但是当我尝试使用 @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]]]

有谁知道这是否可以完成,应该完成,只是一个错误或缺少的功能?

最佳答案

问题似乎是,注释导致 springDataNeo4j 优先考虑关系名称。我在我创建的另一个样本上尝试了同样的方法。如果两个注释都包含type="OWNS"它混合了两个“对象”。当我省略这些信息而只使用方向和类型时,它对我有用。

不幸的是,如果您使用另一个 @RelatedTo 注释和更多与另一个注释相关的宠物或汽车,这将导致问题。由于“OWNS”和与宠物类型的任何其他关系之间没有区别,因此该集合返回所有相关的宠物(例如:peter ->(HATES-Relationsip)->dogs)。

如果它是一个错误,我不知道......但对于数据库:只有节点和关系。两者都没有键入,因此 neo4j 对您的“宠物”或“汽车”类一无所知。 Spring data neo4j 处理这个问题,要么通过索引每种类型的所有节点并设置类型属性,要么使用特定的图形布局(带有子引用)。即使您想通过遍历描述获取一个人的所有宠物,您也需要编写更多代码,因为名称为“OWNS”的传出关系包含两种类型的对象。

我建议使用两个不同的名称。稍后编写自定义遍历/查询会更容易,而且可能会更快,因为不需要类类型比较。有什么理由,为什么你需要这些特定的名字?

PS:有可能,并非一切都是 100% 准确的。我不知道 springdataneo4j 的细节,但这就是我到目前为止所想到的。

关于spring - 具有相同类型的多个关系类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10763141/

相关文章:

python - 在neo4j的bulbs框架中是否有等同的提交

neo4j - 实体不是持久类 NEO4J 4.0.0 的实例

neo4j - Neo4J 中的无向关系

Spring Security 在安全注释配置中排除 url 模式

java - spring security 3.0.3配置错误

node.js - nodejs neo4j 不访问参数 req.params.x 但接受任何硬编码值

java - Spring Neo4j CGLIB需要处理@Configuration类

java - 我自己的网页没有显示在本地主机上

java - Spring MVC 项目上的“缺少 Artifact ”和 'Failed to read artifact descriptor' 错误

postgresql - 用于近实时 ETL 架构的正确工具