2015-11-02 42 views
5

使用新的Neo4j 2.3 OGM。当试图通过ID加载实体我有以下问题:通过loadAll加载递归关系时出错ids

@NodeEntity 
class Person { 
    Long id; 
    String name; 

    @Relationship(type="Friend", direction = Direction.OUTGOING) 
    public List<Person> friends; 
} 

假设(1, “亚历克斯”)朋友(2, “约瑟夫”)(3, “人” )(4, “那提”)是朋友(5, “阿密特”),使用下面的代码:

session.loadAll(Person.class,Arrays.toList(新龙(){ 1L,4L}),1)

应该返回2个对象,包含亚历克斯2个朋友(盖伊,约瑟夫)和含有那提一个朋友但它实际上返回的是5个对象(亚历克斯,Guy,Joseph,Nati,Amit)。尽管Mike和Nati确实包含了他们的朋友,但是我通过两个ID请求Person s并且得到了一个包含5的Iterable,这似乎很奇怪(当然也是不需要的)。有人知道这是为什么吗?这是一个错误?

回答

1

现在在1.1.4-SNAPSHOT构建中修复了此问题。

+0

太棒了!感谢您的快速解决! – Nayish

1

这是设计。 OGM具有搜索深度的概念。默认情况下(在您的示例中,显式地)搜索深度为1,意思是从图中连同它们的直接邻居一起获取请求的对象。如果您不想要这种行为,可以明确设置搜索深度。将它设置为如下零:

session.loadAll(Person.class, Arrays.toList(new Long() { 1L, 4L }), 0) 

将只提取请求的对象。

+0

我认为你没有明白发生了什么,它返回亚历克斯(包含约瑟夫和盖伊)和纳提(含阿米特),直到这里一切顺利,但奇怪的是它还返回3个更多的人物(阿米特,约瑟夫和古特)在Iterable中。另一方面,如果Person与Job类型的对象有关系,则它不会将其加载到迭代器中,而只会将其返回到适当的Person对象下面。只是因为子对象与父类型相同,所以它将它添加到session.loadAll(Person.class,Arrays.toList(new Long(){1L,4L}),0)'不会填充到Iterable – Nayish

+0

Alex和Nati的朋友关系 – Nayish

+1

对不起Nayish,我误解了你在说什么。是的,我期望创建五个对象,但Iterable我希望只包含id所请求的两个对象。所以这看起来像一个错误,我已经在这里提出了一张票:https://github.com/neo4j/neo4j-ogm/issues/79 – Vince