我写了一个密码查询来显示两个电影节点之间的关系:
MATCH (m1:Movie)-[r*1..2]-(m2:Movie)
where m1.movieID = '1' AND m2.movieID = '2'
RETURN r
LIMIT 25
它在Neo4j浏览器中返回,这正是我想在d3.js中创建的内容。最终,movieID将成为参数,因此每对电影的结果都不同。
我一直在关注Neo4j核心Ruby示例seen here来创建我自己的图形,但我的问题是我不能RETURN
两个动作之间的公共节点,即{{1 } / Tag
个节点。
我该如何解决这个问题?我应该创建一个查询来返回两部电影,还有另一个查询来返回它们之间的公共节点?我怎么写这个后面的查询?我真的被困在如何想象这种关系......
答案 0 :(得分:2)
也许您应该尝试匹配路径而不是现在的关系。类似的东西:
MATCH p=(m1:Movie { movieID: 1 } )-[r*1..2]-(m2:Movie { movieID: 2 } )
RETURN p;
然后,您可以在路径对象p
上使用collection functions来执行任何操作。例如,如果要获取内部节点,可以使用nodes(p)
并简单地删除第一个和最后一个节点(可以是m1
和m2
)并获取沿着节点的节点路径。
答案 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!