gpt4 book ai didi

java - Spring Data Neo4j 和查询

转载 作者:行者123 更新时间:2023-11-30 08:21:23 24 4
gpt4 key购买 nike

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

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

...
}

我本来用的是Spring Data Neo4j模板接口(interface),发现返回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 服务。如果有任何 future 的工作会影响到这一点,我会喜出望外听到它。

最佳答案

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

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

一个想法是使用 RETURN {id:id(n), labels:labels(n), data:n)} as n 进行完整表示。问题是这打破了用户定义的查询。

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

关于java - Spring Data Neo4j 和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com