1

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

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-core Ruby 示例来创建我自己的图表,但我的问题是我不能RETURN在两个移动之间共用节点,即Tag/Country节点。

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

4

2 回答 2

2

也许您应该尝试匹配路径而不是现在的关系。就像是:

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

然后,您可以在路径对象上使用集合函数p来做任何您喜欢的事情。例如,如果要获取内部节点,可以使用nodes(p)并简单地删除第一个和最后一个节点(即m1and m2)并沿路径获取节点。

于 2016-03-01T12:30:48.760 回答
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!
于 2016-03-01T12:41:15.123 回答