2015-04-07 1 views
0

Я хочу визуализировать данные neo4j, которые мне нужны, чтобы вернуть все узлы и ребра некоторого подграфа. Например, на моем графике есть эти отношения: (: Пользователь) - [: RATED] -> (: Movie) - [: HAS_GENRE] -> (: Жанр), (: Пользователь) - [: ПОДОБИЯ) -> (: Пользователь). Я хочу показать подграф, который является центром указанного фильма.как вернуть коллекцию нескольких узлов или ребер в neo4j с использованием cypher

Соответствующий сегмент этого кода показан ниже.

@Query("match (u:User)-[r:RATED]->(m:Movie)-[hg:HAS_GENRE]->(g:Genre) where m.id={0} return id(u) as id, case labels(u)[0] when 'Genre' then u.name when 'User' then u.id when 'Movie' then u.title end as caption, labels(u)[0] as type " 
     + "union " 
     + "match (u:User)-[r:RATED]->(m:Movie)-[hg:HAS_GENRE]->(g:Genre) where m.id={0} return id(m) as id, case labels(m)[0] when 'Genre' then m.name when 'User' then m.id when 'Movie' then m.title end as caption, labels(m)[0] as type " 
     + "union " 
     + "match (u:User)-[r:RATED]->(m:Movie)-[hg:HAS_GENRE]->(g:Genre) where m.id={0} return id(g) as id, case labels(g)[0] when 'Genre' then g.name when 'User' then g.id when 'Movie' then g.title end as caption, labels(g)[0] as type") 
    List<NodeInfo> findMovieRelevantNodes(int movieId); 

    @Query("match (u:User)-[r:RATED]->(m:Movie)-[hg:HAS_GENRE]->(g:Genre) where m.id={0} return id(u) as source,type(r) as type, id(m) as target, case type(r) when 'HAS_GENRE' then r.probability when 'SIMILARITY' then r.similarity when 'RATED' then r.rate end as caption " 
     + "union " 
     + "match (u:User)-[r:RATED]->(m:Movie)-[hg:HAS_GENRE]->(g:Genre) where m.id={0} return id(m) as source,type(hg) as type, id(g) as target, case type(hg) when 'HAS_GENRE' then r.probability when 'SIMILARITY' then r.similarity when 'RATED' then r.rate end as caption") 
    List<EdgeInfo> findMovieRelevantEdges(int movieId); 

@QueryResult 
public interface NodeInfo { 
    @ResultColumn("id") 
    int getId(); 

    @ResultColumn("caption") 
    String getCaption(); 

    @ResultColumn("type") 
    String getType(); 
} 

@QueryResult 
public interface EdgeInfo { 
    @ResultColumn("source") 
    int getSource(); 

    @ResultColumn("type") 
    String getType(); 

    @ResultColumn("target") 
    int getTarget(); 

    @ResultColumn("caption") 
    String getCaption(); 
} 

Похоже, что это избыточно и неустойчиво. Так что есть несколько лучших способов переписать эти запросы cypher.

ответ

0

Попробуйте это:

match (u:User)-[r:RATED]->(m:Movie)-[hg:HAS_GENRE]->(g:Genre) 
where m.id={0} 
return {id:id(u), caption:u.id} as user, 
     {id:id(m), caption:m.title} as movie, 
     {id:id(g), caption:g.name} as genre; 
+0

Это не работает. Он возвращает список карт, подобный этому »{genre = {id = 5, caption = Comedy, type = Genre}, movie = {id = 22, caption = Toy Story (1995), type = Movie}, user = {id = 19, caption = 1, type = User}} " –

Смежные вопросы