如何使用d3.js可视化Neo4j中两个节点之间的关系?

时间:2016-03-01 12:12:28

标签: ruby d3.js neo4j neo4j.rb visualize

我写了一个密码查询来显示两个电影节点之间的关系:

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核心Ruby示例seen here来创建我自己的图形,但我的问题是我不能RETURN两个动作之间的公共节点,即{{1 } / Tag个节点。

我该如何解决这个问题?我应该创建一个查询来返回两部电影,还有另一个查询来返回它们之间的公共节点?我怎么写这个后面的查询?我真的被困在如何想象这种关系......

2 个答案:

答案 0 :(得分:2)

也许您应该尝试匹配路径而不是现在的关系。类似的东西:

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

然后,您可以在路径对象p上使用collection functions来执行任何操作。例如,如果要获取内部节点,可以使用nodes(p)并简单地删除第一个和最后一个节点(可以是m1m2)并获取沿着节点的节点路径。

答案 1 :(得分: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!