在深度 > 0 的 findBy Spring 数据 Neo4J 查询中指定方向
Specify the direction in findBy Spring data Neo4J queries with depth > 0
我使用 SDN 4.2.1 在 Neo4J 中保存和加载节点及其关系。
直到现在,我一直在使用深度参数等于 2 的 findByXXX 方法。现在我需要将深度增加到 3,但是查询速度太慢了,我知道为什么:执行的查询没有考虑关系的方向。
这是从日志中执行的查询(耗时超过 20 秒):
o.n.o.drivers.bolt.request.BoltRequest : Request: MATCH (n:`Property`) WHERE n.`id` = { `id_0` } WITH n MATCH p=(n)-[*0..3]-(m) RETURN p, ID(n) with params {id_0=P31}
当我用方向 重写查询 时,它变得非常快:
MATCH (n:`Property`) WHERE n.`id` = "P31" WITH n MATCH p=(n)-[*0..3]->(m) RETURN p, ID(n)
我找不到一种方法来指定,在我的例子中,我只想在我的 GraphRepository 接口的 findByXXX 函数声明中使用 "outgoing" 关系。是否有像“@Depth”注解这样的参数来指明方向?
目前无法通过注释声明更细粒度的查询。实际上,在代码中有一些关于(不)遵循某些路径的提示可能对特定用例有好处,但对其他用例则无关紧要。
看看在 JPA 上做了什么:您可以使用注释来预先加载依赖对象。但是一旦应用程序增长,您必须管理 FetchProfiles 或 NamedEntityGraphs 以根据用例处理您获取的方式。
这就是为什么使用 SDN 4.x 的首选方法是使用自定义密码查询。它将确保您以高效的方式只获取所需的数据。
跟踪这个问题 here。
请注意,这是为 OGM/SDN 的下一个主要版本计划的改进之一。
如果您有特定的用例需要解决或对此有想法,请随时在 Slack 频道上展开讨论 neo4j-users。
我使用 SDN 4.2.1 在 Neo4J 中保存和加载节点及其关系。
直到现在,我一直在使用深度参数等于 2 的 findByXXX 方法。现在我需要将深度增加到 3,但是查询速度太慢了,我知道为什么:执行的查询没有考虑关系的方向。
这是从日志中执行的查询(耗时超过 20 秒):
o.n.o.drivers.bolt.request.BoltRequest : Request: MATCH (n:`Property`) WHERE n.`id` = { `id_0` } WITH n MATCH p=(n)-[*0..3]-(m) RETURN p, ID(n) with params {id_0=P31}
当我用方向 重写查询 时,它变得非常快:
MATCH (n:`Property`) WHERE n.`id` = "P31" WITH n MATCH p=(n)-[*0..3]->(m) RETURN p, ID(n)
我找不到一种方法来指定,在我的例子中,我只想在我的 GraphRepository 接口的 findByXXX 函数声明中使用 "outgoing" 关系。是否有像“@Depth”注解这样的参数来指明方向?
目前无法通过注释声明更细粒度的查询。实际上,在代码中有一些关于(不)遵循某些路径的提示可能对特定用例有好处,但对其他用例则无关紧要。
看看在 JPA 上做了什么:您可以使用注释来预先加载依赖对象。但是一旦应用程序增长,您必须管理 FetchProfiles 或 NamedEntityGraphs 以根据用例处理您获取的方式。
这就是为什么使用 SDN 4.x 的首选方法是使用自定义密码查询。它将确保您以高效的方式只获取所需的数据。
跟踪这个问题 here。 请注意,这是为 OGM/SDN 的下一个主要版本计划的改进之一。 如果您有特定的用例需要解决或对此有想法,请随时在 Slack 频道上展开讨论 neo4j-users。