我有以下Neo4j SDN5 / OGM / Cypher逻辑:
MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue)
WHERE v.id = {valueId}
OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User)
WHERE {fetchCreateUsers}
WITH u, hv
ORDER BY hv.createDate DESC
WITH count(hv) as count, COLLECT({u: u, hv: hv}) AS data
RETURN REDUCE(s = [], i IN RANGE(0, count - 1, {step}) | s + data[i]) AS result
我按以下方式执行此查询:
parameters.put("valueId", valueId);
parameters.put("fetchCreateUsers", fetchCreateUsers);
parameters.put("step", step);
StringBuilder cypherQuery = new StringBuilder();
cypherQuery .append(query)); // the query mentioned above
Result queryResult = session.query(cypherQuery.toString(), parameters);
for (Map<String, Object> result : queryResult) {
Map<String, Object>[] maps = (Map<String, Object>[]) result.get("result");
for (Map<String, Object> map : maps) {
System.out.println(map.get("hv").getClass());
System.out.println(map.get("u"));
}
}
我希望收到map.get("hv")
作为我的域对象模型 - HistoryValue
,但它是org.neo4j.driver.internal.InternalNode
的类。
有没有办法让hv
和u
个对象作为我的SDN域模型的实例?
答案 0 :(得分:1)
您正在使用&#34; raw&#34;来查询数据库。密码呼叫:Result queryResult = session.query(cypherQuery.toString(), parameters);
这只会以java-driver生成的形式返回数据。
要获得真实的对象映射,您必须使用支持用户类型的OGM会话方法,例如Session#load(Class, ID)
等。或者在SpringData Neo4j存储库中创建一个@Query
带注释的方法,并在包中注释一个附加的类@QueryResult
,用于扫描实体。 Details in SpringData Neo4j documentation