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

Ruby 如何使用d3.js可视化Neo4j中两个节点之间的关系?,ruby,d3.js,neo4j,neo4j.rb,visualize,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中创建的。最终,电影ID将成为参数,因此每对电影的结果将不同 我一直在遵循Neo4j core Ruby示例来创建自己的图形,但我的问题是,我不能返回两个移动之间的公共节点,即标记/国家节点 我应

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

MATCH (m1:Movie)-[r*1..2]-(m2:Movie)
where m1.movieID = '1' AND m2.movieID = '2'
RETURN r
LIMIT 25
它在Neo4j浏览器中返回,这正是我想在d3.js中创建的。最终,电影ID将成为参数,因此每对电影的结果将不同

我一直在遵循Neo4j core Ruby示例来创建自己的图形,但我的问题是,我不能
返回两个移动之间的
公共节点,即
标记
/
国家
节点


我应该如何解决这个问题?我应该创建一个查询来返回这两部电影,再创建一个查询来返回它们之间的公共节点吗?我将如何编写后一个查询?我真的很难想象这种关系……

也许你应该尝试匹配路径,而不是像现在这样匹配关系。比如:

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!
result=neo4j_session.query(查询字符串)
数据={节点:[],关系:[]}
结果。每个do |行|

数据[:节点]对于
数据[:关系]
您不也需要源节点和目标节点吗?不会
row.rel
仅返回关系属性(如果存在)?
rel
返回关系对象(如果您处于服务器模式,将是
CypherRelationship
对象),该对象应具有
start\u node\u neo\u id
end\u node\u neo\u id
方法