【问题标题】:How do I query for relationship data in spring data neo4j 4?spring data neo4j 4中如何查询关系数据?
【发布时间】:2015-10-12 07:21:54
【问题描述】:

我有一个密码查询,它应该返回节点和边,以便我可以在 Web 应用程序中呈现我的图形表示。我在 Neo4jOperations 中使用query 方法运行它。

start n=node({id}) match n-[support:SUPPORTED_BY|INTERPRETS*0..5]->(argument:ArgumentNode)
return argument, support

之前,我使用带有嵌入式数据库的 spring data neo4j 3.3.1,该查询在返回具有起始节点和结束节点的关系代理方面做得很好。我已经升级到 spring data neo4j 4.0.0 并切换到使用远程服务器,现在它返回可悲的空 LinkedHashMaps。

这是来自服务器的 json 响应:

{"commit":"http://localhost:7474/db/data/transaction/7/commit","results":[{"columns":["argument","support"],
    "data":[
        {"row":[{"buildVersion":-1},[]]},
        {"row":[{"buildVersion":-1},[{}]]}
    ]}],"transaction":{"expires":"Mon, 12 Oct 2015 06:49:12 +0000"},"errors":[]}

我通过在 DefaultRequest.java 中放置一个断点并执行 EntityUtils.toString(response.getEntity()) 获得了这个 json。该查询应该返回两个通过INTERPRETS 类型的边相关的节点。在响应中,您会看到 [{}],这是有关边缘的数据的位置。

如何获得所需数据的响应?

【问题讨论】:

    标签: spring-data-neo4j spring-data-neo4j-4


    【解决方案1】:

    免责声明:这不是一个确定的答案,只是我到目前为止拼凑的答案。

    您可以使用Neo4jOperations 中的queryForObjects 方法,并确保您的查询返回一个路径。示例:

    neo4jOperations.queryForObjects(ArgumentNode.class, "start n=node({id}) match path=n-[support:SUPPORTED_BY|INTERPRETS*0..5]->(argument:ArgumentNode) return path", params);
    

    返回的 POJO 应该根据它们的关系注释正确地连接在一起。现在您可以浏览它们并手动构建一组可以序列化的边。不理想,但可行。

    建议您返回路径的文档:

    来自http://docs.spring.io/spring-data/data-neo4j/docs/4.0.0.RELEASE/reference/html/#_cypher_queries

    对于检索映射对象的查询方法,推荐 查询格式是返回一个路径,应该保证已知类型 正确映射并与关系连接在一起 合适。

    为什么 queryForObjects 有帮助的解释:

    在底层,不同类型的查询之间存在区别。它们有GraphModelQueryRowModelQueryGraphRowModelQuery,每个都将resultDataContents: ["row", "graph"] 的不同排列传递给服务器。如果您想要足够的数据来重建图形,则需要确保“图形”在列表中。

    你可以在ExecuteQueriesDelegate里面找到这段代码:

    if (type != null && session.metaData().classInfo(type.getSimpleName()) != null) {
        Query qry = new GraphModelQuery(cypher, parameters);
        ...
    } else {
        RowModelQuery qry = new RowModelQuery(cypher, parameters);
        ...
    }
    

    使用 queryForObjects 可以让您提供一个类型,并将事情转移到 GraphModelQuery 模式。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2014-01-04
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多