【问题标题】:Spring Data Neo4j and queriesSpring Data Neo4j 和查询
【发布时间】:2014-10-04 18:36:27
【问题描述】:

我正在尝试编写一个返回大量数据(200 个节点)的查询。节点很简单:

public class MyPojo{
    private String type;
    private String value;
    private Long createdDate;

    ...
} 

我最初使用的是Spring Data Neo4j模板接口,但是返回了大约100个节点后发现速度很慢。

public interface MyPojoRepository extends GraphRepository<MyPojo> {
    public List<MyPojo> findByType(String type);
}

我打开调试,看看为什么这么慢,结果发现 SDN 正在查询每个节点的标签。这是有道理的,因为我了解 SDN,它需要标签来进行鸭式打字。但是,Cypher 会一次性返回所有相关数据,因此无需这样做。

所以,我尝试将其重写为 Cypher 查询:

public interface MyPojoRepository extends GraphRepository<MyPojo> {
    @Query("MATCH(n:MyPojo) WHERE n.type = {0} RETURN n")
    public List<MyPojo> findByType(String type);
}

这也有同样的问题。我挖得更深了,虽然这个查询一次性返回了所有节点数据,但它忽略了标签。有一种获取它们的方法,它可以在 Neo4j 控制台中使用,所以我使用 SDN 进行了尝试:

"MATCH(n:MyPojo) WHERE n.type = {0} RETURN n, labels(n)"

不幸的是,这导致了有关拥有多个列的异常。在查看源代码之后,这是有道理的,因为 Neo4j 返回一个返回列的映射,在我的例子中看起来像:n, labels(n)。 SDN 无法知道有一个标签列要读取。

所以,我的问题是:有没有办法在 Cypher 查询中提供标签,以防止需要再次查询每个节点? 或者,除此之外,有没有办法向 SDN 提供包含标签和属性的 Node 并将其转换为 POJO?

注意:我意识到 SDN 团队正在努力在未来的版本中完全使用 Cypher。到目前为止,很多代码库都使用旧的(而且,我相信,已弃用)REST 服务。如果未来有任何工作会影响到这一点,我会非常高兴听到这件事。

【问题讨论】:

    标签: java neo4j spring-data-neo4j


    【解决方案1】:

    你说得对,它对于简单的用例是可以解决的,也应该解决。

    不幸的是,当前的 API 不会将标签作为节点的一部分返回,因此我们必须重写内部工作原理以生成额外的元信息并正确返回所有这些信息。

    一个想法是使用RETURN {id:id(n), labels:labels(n), data:n)} as n 来表示完整的表示。 问题是这与用户定义的查询中断。

    不确定我们何时以及如何安排这项工作。随意将其作为 JIRA 问题提出或观看/支持任何相关问题。

    【讨论】:

    • 该查询不返回 Node 类型,而是返回 Scala MapWrapper。 SDN 拒绝尝试将其转换为 DefaultConverter.toNode()。我觉得在内部切换到 Cypher 将有助于加快速度,并使整个练习变得不必要。如果 SDN 可以简单地生成一个查询来拉回节点,它还可以将 labels(n) 添加到该查询中。
    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多