Как визуализировать отношения между двумя узлами в 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!