如何在spring数据neo4j 4中查询关系数据?

时间:2015-10-12 07:21:54

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

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

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

之前,我使用的是带有嵌入式数据库的spring数据neo4j 3.3.1,这个查询很好地返回了与起始节点和结束节点的关系代理。我已升级到spring数据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的边相关的节点。在回复中,您会看到[{}],这是有关边缘的数据的位置。

如何获得我需要的数据回复?

1 个答案:

答案 0 :(得分:3)

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

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

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); ... }

中找到此代码
{{1}}

使用queryForObjects可以提供一个类型,并将其踢到GraphModelQuery模式。