1

我正在使用 Spring-data 通过 REST 访问 Neo4j 数据库。

我的实体之一看起来类似于以下实体:

@NodeEntity
@TypeAlias("org.example.Foo")
public class Foo {
   @GraphId
   private Long nodeId;

   //...

   @RelatedTo(type="HAS_BAR", direction=Direction.OUTGOING)
   private Set<Bar> bars; 

   //...
}

典型的Foo可能有 0-1000Bar秒。大多数时候,Bar加载 a 时不需要这些 s,Foo所以我认为我应该通过不添加@Fetch注释来避免急切加载Bars。

但是,当现在Foo使用生成的存储库方法加载 a 时,Bar加载s - 至少部分加载(仅它们的 nodeId 属性)。

有没有办法避免这种情况?这种行为对性能的影响很大。
我真的希望能够对集合本身使用https://stackoverflow.com/a/16159051/232175中所示的延迟加载。

4

3 回答 3

1

为了使延迟获取工作,spring data 为所有Bar's 创建一个代理,其中包含足够的信息(节点 ID),可用于在需要时延迟获取 Bar。这就是为什么Bar在您的情况下创建 's 的原因。我建议您使用Neo4jTemplate来仅提取您正在寻找的 Foo 属性,如下所示

Result<Map<String, Object>> result = template.query("START n=node({0}) RETURN n.property1, n.property2, n.property3");
result.handle(new Handler<Map<String, Object>>()
{
    @Override
    public void handle(Map<String, Object> row)
    {
        System.err.println(row.get("n.property1"));
        System.err.println(row.get("n.property2"));
        System.err.println(row.get("n.property3"));
    }
});
于 2013-08-26T14:27:53.650 回答
0

如果您大部分时间都不需要 Bars,请将它们从您的实体中删除,并在需要时使用密码加载它们?

除此之外,spring-data-neo4j 不支持简单模式下的显式延迟加载,但您可以尝试使用高级映射模式(http://static.springsource.org/spring-data/data-graph/snapshot- )站点/参考/html/#reference:aspectj )

于 2013-08-29T10:27:22.287 回答
0

如果您没有任何特别的理由通过 rest 使用 neo4j,您可以使用嵌入不存在此问题的 aspectj 映射的它。您也可以通过 REST 使用它,但根据这篇文章Neo4j Spring data POC for social RESTful layer最好避免使用它。

于 2013-08-29T00:21:01.060 回答