2

使用 SDN 3,可以使用 Neo4jOperations.convert(Object value, Class type) 将返回 Iterable<Map<String, Object>> 的密码查询的结果转换为 Neo4j 域类(使用 @NodeEntity 注释)。例如:

Map<String,Object> results = repository.findSomething("John");
for(Map<String,Object> row : results) {
    Person person = neo4jOperations.convert(row.get("person"), Person.class);
    ...
}

// Repository method
@Query("MATCH (person:Person)-[rel]->(node) WHERE person.firstName = {firstName}  RETURN DISTINCT person, COUNT(rel) ORDER BY COUNT(rel)"
Iterable<Map<String,Object>> findSomething(@Param("firstName") String firstName);

由于 SDN 4 中的 Neo4jOperations 中不再存在 T convert(Object value, Class type) ,那么 SDN 4 中的等价物是什么?

http://docs.spring.io/spring-data/neo4j/docs/4.0.0.M1/reference/html/#reference_programming_model_simple-mapping没有涵盖如何显式或隐式地完成映射/转换。

我正在使用快照构建。

非常感谢任何帮助。

4

2 回答 2

2

正如 Luanne 建议的那样,您目前需要分两步执行此操作。对于存储库方法,您可以尝试这样的方法:

@Query("MATCH (p:Person)-[rel]->(node) WHERE p.firstName = {firstName} RETURN DISTINCT p ORDER BY COUNT(rel)")
Iterable<Person> findSomething(@Param("firstName") String firstName);

这应该Person以正确的顺序返回您想要的实体,尽管我很欣赏实际计数不会被映射,因此不幸的是,您必须发出第二个查询才能找到计数。

如果您不需要实际的Person实体,而只需要这些节点的一些属性,那么解决方法可能是映射到一个@QueryResult对象。像这样的东西:

@Query("MATCH (p:Person)-[rel]->(node) WHERE p.firstName = {firstName} RETURN DISTINCT p.firstName, p.surname, p.dateOfBirth, COUNT(rel) AS rank ORDER BY rank")
Iterable<PersonQueryResult> findSomething(@Param("firstName") String firstName);

...其中PersonQueryResult是一个 POJO,使用与@QueryResult查询的 return 子句中列出的属性相对应的 setter/getter 进行注释。

于 2015-06-29T09:13:50.340 回答
1

For this use case, you'll have to return ID(person) and use the repository.findOne or neo4jOperations.load instead.

于 2015-06-29T03:21:28.357 回答