2013-03-18 5 views
0

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

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?

ответ

3

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

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(); 
} 
+0

Спасибо! Работает аннотация '@ MapResult'. Однако я получаю это исключение при вызове метода getLocations() ': org.springframework.data.neo4j.conversion.QueryResultBuilder $ 1 не может быть добавлено в java.util.Collection' Любая идея? – Stanley

+0

Хм, хорошая точка, вы можете использовать '@ResultColumn (« location ») Iterable getLocations();' –

+0

Я получаю еще одно исключение при попытке вызвать метод 'next()' 'Iterator':' java.lang .RuntimeException: Не удается извлечь одно значение из Iterable с несколькими элементами. ' – Stanley