【发布时间】: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