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
方法