Как преобразовать org.neo4j.rest.graphdb.entity.RestNode в Spring Data Neo4j Node Entity

Я использую Spring Data для Neo4j для доступа к графику Neo4j. У меня есть UserRepository с аннотированным запросом, как показано ниже:

package com.abc.graph.repository;

import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.GraphRepository;
import org.springframework.data.neo4j.repository.NamedIndexRepository;
import org.springframework.data.neo4j.repository.RelationshipOperationsRepository;

import com.abc.graph.entity.User;

public interface UserRepository extends GraphRepository<User>, NamedIndexRepository<User>,
        RelationshipOperationsRepository<User> {
    public User findById(String id);

    public Page<User> findByNameLike(String name, Pageable page);

    @Query("START user=node:User(id={0}) " +  
            "MATCH user-[:VISITS]->(location)<-[:VISITS]-(similar_user) " +
            "RETURN similar_user, collect(location) as locations, count(*) as count " + 
            "ORDER BY count desc ")
    public List<Map<String, Object>> findSimilarUsersByPlaceVisited(String userId);
}

То, что я пытаюсь получить из графика, — это список пользователей, которые были в похожих местах, и для каждого пользователя, в каких общих местах они были. Метод вернет список Map<String, Object>. Каждая карта будет содержать такие ключи, как similar_user, locations и count.

Из оператора отладки я вижу, что similar_user является экземпляром org.neo4j.rest.graphdb.entity.RestNode. Есть ли способ преобразовать его в мой объект узла Spring Data, который равен com.abc.graph.entity.User?


person Stanley    schedule 18.03.2013    source источник


Ответы (1)


Вы можете сделать это вручную, используя:

template.createEntityFrom[Stored]State(userNode[,User.class)

Или вы определяете в качестве результата Iterable или Collection интерфейса, аннотированного @MapResult с геттерами для трех столбцов. Он либо автоматически сопоставляет имена геттеров с результирующими столбцами, либо вы можете указать имя для сопоставления.

@MapResult
interface SimilarUser {

   @ResultColumn("count") int getCount();
   @ResultColumn("similar_user") User getUser();
   @ResultColumn("locations") Collection<Location> getLocations();
}
person Michael Hunger    schedule 18.03.2013
comment
Спасибо! Аннотация @MapResult работает. Однако я получаю это исключение при вызове метода getLocations(): org.springframework.data.neo4j.conversion.QueryResultBuilder$1 cannot be cast to java.util.Collection Любая идея? - person Stanley; 19.03.2013
comment
Хм, хорошая мысль, вы можете использовать @ResultColumn("locations") Iterable<Location> getLocations(); - person Michael Hunger; 20.03.2013
comment
Я получаю еще одно исключение при попытке вызвать метод next() для Iterator: java.lang.RuntimeException: Cannot extract single value from Iterable with more than one elements. - person Stanley; 20.03.2013