如何在 spring data neo4j 4 中查询关系数据?
How do I query for relationship data in spring data neo4j 4?
我有一个密码查询,它应该 return 节点和边,这样我就可以在网络应用程序中呈现我的图形表示。我 运行 它使用 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,这个查询很好地 returning 了具有起始节点和结束节点的关系代理。我已经升级到 spring 数据 neo4j 4.0.0 并切换到使用远程服务器,现在它 return 可悲地是空的 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。查询应该 return 两个节点,它们通过 INTERPRETS
类型的边相关。在响应中,您会看到 [{}]
,这是有关边缘的数据所在的位置。
如何获得包含我需要的数据的响应?
免责声明:这不是一个明确的答案,只是我目前拼凑的答案。
您可以在 Neo4jOperations
中使用 queryForObjects
方法,并确保您的查询 return 是一个路径。示例:
neo4jOperations.queryForObjects(ArgumentNode.class, "start n=node({id}) match path=n-[support:SUPPORTED_BY|INTERPRETS*0..5]->(argument:ArgumentNode) return path", params);
返回的 POJO 应该根据它们的关系注释正确地连接在一起。现在您可以浏览它们并手动构建一组可以序列化的边缘。不理想,但可行。
文档建议你return一个路径:
来自 http://docs.spring.io/spring-data/data-neo4j/docs/4.0.0.RELEASE/reference/html/#_cypher_queries:
For the query methods that retrieve mapped objects, the recommended
query format is to return a path, which should ensure that known types
get mapped correctly and joined together with relationships as
appropriate.
解释为什么 queryForObjects 有帮助:
在底层,不同类型的查询是有区别的。它们有 GraphModelQuery
、RowModelQuery
和 GraphRowModelQuery
,每个都将 resultDataContents: ["row", "graph"]
的不同排列传递给服务器。如果你想要足够的数据来重建图表,你需要确保 "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 模式。
我有一个密码查询,它应该 return 节点和边,这样我就可以在网络应用程序中呈现我的图形表示。我 运行 它使用 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,这个查询很好地 returning 了具有起始节点和结束节点的关系代理。我已经升级到 spring 数据 neo4j 4.0.0 并切换到使用远程服务器,现在它 return 可悲地是空的 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。查询应该 return 两个节点,它们通过 INTERPRETS
类型的边相关。在响应中,您会看到 [{}]
,这是有关边缘的数据所在的位置。
如何获得包含我需要的数据的响应?
免责声明:这不是一个明确的答案,只是我目前拼凑的答案。
您可以在 Neo4jOperations
中使用 queryForObjects
方法,并确保您的查询 return 是一个路径。示例:
neo4jOperations.queryForObjects(ArgumentNode.class, "start n=node({id}) match path=n-[support:SUPPORTED_BY|INTERPRETS*0..5]->(argument:ArgumentNode) return path", params);
返回的 POJO 应该根据它们的关系注释正确地连接在一起。现在您可以浏览它们并手动构建一组可以序列化的边缘。不理想,但可行。
文档建议你return一个路径:
来自 http://docs.spring.io/spring-data/data-neo4j/docs/4.0.0.RELEASE/reference/html/#_cypher_queries:
For the query methods that retrieve mapped objects, the recommended query format is to return a path, which should ensure that known types get mapped correctly and joined together with relationships as appropriate.
解释为什么 queryForObjects 有帮助:
在底层,不同类型的查询是有区别的。它们有 GraphModelQuery
、RowModelQuery
和 GraphRowModelQuery
,每个都将 resultDataContents: ["row", "graph"]
的不同排列传递给服务器。如果你想要足够的数据来重建图表,你需要确保 "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 模式。