Spring 具有相同类型的多个关系类

Spring 具有相同类型的多个关系类,spring,neo4j,spring-data-neo4j,Spring,Neo4j,Spring Data Neo4j,使用spring-data-neo4j,我想创建两个类,使用@RelationshipEntity(type=“OWNS”)将个人类链接到宠物和汽车 @RelationshipEntity(type="OWNS") public class OwnsCar { @Indexed private String name; @StartNode private Person person; @EndNode private Car car; }

使用spring-data-neo4j,我想创建两个类,使用
@RelationshipEntity(type=“OWNS”)
个人
类链接到
宠物和
汽车

@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<Pet> pets;

    @RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Car.class)
    private Set<Car> cars;
} 

是否有人知道这是否可以做到,是否应该做到,只是一个bug或缺少的功能?

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

不幸的是,如果您正在使用另一个@RelatedTo注释,并且有更多宠物或汽车与另一个注释相关,那么这将导致出现问题。由于“拥有”与宠物类型的任何其他关系之间没有区别,因此集合返回所有相关宠物(例如:peter->(讨厌Relationsip)->狗)

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

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

PS:有可能不是所有的东西都是100%准确的。我不知道springdataneo4j的详细情况,但到目前为止我已经知道了

Person [nodeId=1, name=Nick, pets=[Car [nodeId=3, name=Thunderbird]], cars=[Car [nodeId=3, name=Thunderbird]]]