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

时间:2012-05-26 02:21:20

标签: 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]]]

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

1 个答案:

答案 0 :(得分:3)

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

不幸的是,如果您使用另一个与另一个注释相关的宠物或汽车的@RelatedTo注释,这将导致问题。由于“OWNS”与任何其他与宠物类型的关系没有区别,该套装会返回所有相关宠物(例如:彼得 - >(HATES-Relationsip) - >狗)。

如果它是一个bug或者不是,我说不出来......但是对于数据库:只有节点和关系。两者都没有输入,所以neo4j对你的'Pet'或'Car'-Class一无所知。 Spring数据neo4j通过索引每个类型的所有节点并设置type-attribute,或使用特定的图形布局(带子引用)来处理这个问题。即使你想要获取具有遍历描述的人的所有宠物,你也会有更多的代码要编写,因为名称为'OWNS'的传出关系包含两种类型的对象。

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

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