Как визуализировать отношения между двумя узлами в 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 будут параметрами, поэтому результаты будут разными для каждой пары фильмов.

введите описание изображения здесь

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

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

2 ответа

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

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

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

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

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!
Другие вопросы по тегам