Spring 域对象的数据 Neo4j/OGM 会话查询

Spring Data Neo4j/OGM session query for domain object

我有以下 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 的 class。

有什么方法可以将 hvu 对象作为我的 SDN 域模型的实例吗?

您正在使用 "raw" 密码调用查询数据库:Result queryResult = session.query(cypherQuery.toString(), parameters); 这将只是 return java-驱动程序生成的形式的数据。

要获得真实对象映射,您必须使用支持用户类型的 OGM 会话方法,例如Session#load(Class, ID) 等,或者在您的 SpringData Neo4j 存储库中创建一个 @Query 注释方法,并在您的包中注释一个额外的 class @QueryResult 以扫描实体。 Details in SpringData Neo4j documentation.