2016-03-01 13 views
1

Я написал Cypher запрос, чтобы показать связь между двумя узлами фильма:Как визуализировать связь между двумя узлами в Neo4j с помощью d3.js?

MATCH (m1:Movie)-[r*1..2]-(m2:Movie) 
where m1.movieID = '1' AND m2.movieID = '2' 
RETURN r 
LIMIT 25 

возвращает это в браузере Neo4j, и это именно то, что я хочу, чтобы создать в d3.js. В конце концов, идентификаторы movieID будут параметрами, поэтому результаты будут разными для каждой пары фильмов.

enter image description here

Я после Neo4j-жильный Рубиновый пример seen here, чтобы создать свой собственный график, но моя проблема в том, что я не могу RETURN общие узлы между двумя движениями, т.е. Tag/Country узлы.

Как решить эту проблему? Должен ли я создать запрос для возврата двух фильмов и другого запроса, чтобы вернуть общие узлы между ними? Как мне написать этот последний запрос? Я действительно зациклился на том, как я могу визуализировать эти отношения ...

ответ

2

Возможно, вам стоит попробовать сопоставить путь, а не отношения, как вы сейчас. Что-то вроде:

MATCH p=(m1:Movie { movieID: 1 })-[r*1..2]-(m2:Movie { movieID: 2 }) 
RETURN p; 

Вы можете использовать collection functions на объекте пути p делать все, что вам нравится с ним. Например, если вы хотите получить внутренние узлы, вы можете использовать nodes(p) и просто удалить первый и последний узлы (которые будут m1 и m2) и получить узлы вдоль пути.

0

Вы можете вернуть фильмы с отношениями:

MATCH (m1:Movie)-[r*1..2]-(m2:Movie) 
WHERE m1.movieID = '1' AND m2.movieID = '2' 
RETURN m1, m2, r 
LIMIT 25 

Хотя это может дать вам дублирования. Если вы собираетесь отображать это с помощью D3, вероятно, все, что вам нужно, это все связанные отношения и их начальные/конечные узлы. Чтобы сделать это, вы могли бы сделать:

MATCH (m1:Movie)-[rels*1..2]-(m2:Movie) 
WHERE m1.movieID = '1' AND m2.movieID = '2' 
RETURN rels 
UNWIND rels AS r 
WITH DISTINCT r AS rel 
WITH startnode(rel) AS startnode, endnode(rel) AS endnode, rel 
LIMIT 25 

Вообще то, что вы хотите, чтобы в конечном итоге представляет собой совокупность узлов и связей, участвующих. Таким образом, с результатом этого запроса вы можете:

result = neo4j_session.query(query_string) 

data = {nodes: [], relationships: []} 
result.each do |row| 
    data[:nodes] << row.startnode 
    data[:nodes] << row.endnode 
    data[:relationships] << row.rel 
end 

data[:nodes].uniq! 
+0

Для 'data [: relationship]' вам также не понадобится источник и целевой узел? Не будет ли 'row.rel' возвращать только свойство отношений (если оно существует)? – f7n

+0

'rel' возвращает объект отношения (если вы находитесь в режиме сервера, который будет объектом' CypherRelationship'), который должен иметь методы 'start_node_neo_id' и' end_node_neo_id' –

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

  • Нет связанных вопросов^_^