【问题标题】:Specify the direction in findBy Spring data Neo4J queries with depth > 0在 findBy Spring data Neo4J 查询中指定深度 > 0 的方向
【发布时间】:2017-04-10 09:27:59
【问题描述】:

我使用 SDN 4.2.1 在 Neo4J 中保存和加载节点及其关系。

到目前为止,我使用的 findByXXX 方法的深度参数等于 2。现在我需要将深度增加到 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 函数声明中的“传出”关系。有没有像“@Depth”注解这样的参数来给出方向?

【问题讨论】:

    标签: spring neo4j spring-data-neo4j


    【解决方案1】:

    目前无法通过注释声明更细粒度的查询。实际上,在代码中包含一些关于(不)遵循某些路径的提示可能对特定用例有好处,但对其他用例则无关紧要。

    看看在 JPA 上做了什么:您可以使用注释来急切地加载依赖对象。但是一旦应用程序增长,您必须管理 FetchProfilesNamedEntityGraphs 以根据用例处理您获取的方式。

    这就是为什么在 SDN 4.x 中,首选的方法是使用自定义密码查询。它将确保您以高效的方式仅获取所需的数据。

    跟踪此here 存在问题。 请注意,这是为 OGM / SDN 的下一个主要版本计划的改进之一。 如果您有需要解决的特定用例或有关此问题的想法,请随时在 slack 频道 neo4j-users 上进行讨论。

    【讨论】:

    • 有没有办法用可变深度参数编写查询?我试过这样做:@Query("MATCH (n:`Item`) WHERE n.`id`={id} WITH n MATCH p=(n)-[*0..{depth}]->(m) RETURN n as item, nodes(p), rels(p)") ItemResult findByid(@Param("id") String id, @Param("depth") int depth); 但我得到这个 SyntaxError:'参数映射不能在 MATCH 模式中使用(改用文字映射)" 顺便说一下,用3 替换 {depth} 效果很好......
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多