Neo4j Cypher交替使用节点和关系

3
如何交错返回节点和关系? 使用 Matrix 电影数据库,查询语句为:
    MATCH p=(a1:Actor {name:"Keanu Reeves"})-[r *0..5]-(a2:Actor {name: "Carrie-Anne Moss"})
    return [n in nodes(p)|coalesce(n.title,n.name)], [rel in relationships(p)|type(rel)]

返回两列,一列是节点,另一列是关系。

    Keanu Reeves, The Matrix, Laurence Fishburne, The Matrix Reloaded, Carrie-Anne Moss | ACTS_IN, ACTS_IN, ACTS_IN, ACTS_IN
    ...

但我希望

    Keanu Reeves, ACTS_IN, The Matrix, ACTS_IN, Laurence Fishburne, ACTS_IN, The Matrix Reloaded, ACTS_IN, Carrie-Anne Moss
    ...
2个回答

1

这个曾经很容易,但是在2.0-RC1版本中,他们使Cypher中的路径不再是集合,因此“简单方法”现在变得更加困难。

match p= shortestPath((kevin)-[:ACTED_IN*]-(charlize))
where kevin.name="Kevin Bacon"
and charlize.name="Charlize Theron"
with nodes(p) as ns, rels(p) as rs, range(0,length(nodes(p))+length(rels(p))-1) as idx
return [i in idx | case i % 2 = 0 when true then coalesce((ns[i/2]).name, (ns[i/2]).title) else type(rs[i/2]) end];

旧的方法是:

match p= shortestPath((kevin)-[:ACTED_IN*]-(charlize))
where kevin.name="Kevin Bacon"
and charlize.name="Charlize Theron"
return [x in p | coalesce(x.name,x.title, type(x))]

更改的好处是现在路径更加类型安全,尽管我需要花费相当多的时间才能同意它们。这种查询的真正用例很少。

谢谢。我不知道它已经改变了(我只在v2中尝试过这个),但第二个解决方案一开始对我来说似乎很明显(并且没有起作用),p将是一个集合。 - user3114859

1
这里是另一个解决方案:

MATCH (kevin:Person {name="Kevin Bacon"}), (charlize:Person {name:"Charlize Theron"})
MATCH p= shortestPath( (kevin)-[:ACTED_IN*]-(charlize) )

WITH nodes(p)+rels(p) AS c, length(p) AS l 
RETURN reduce(r=[], x IN range(0,l) | r + (c[x]).name + type(c[l+x+1]))

将路径重新聚合成一个集合,然后仅使用路径长度作为偏移量来访问第二个部分。
如果您不需要“展平”集合,则可以使用Reduce。
MATCH (kevin:Person {name="Kevin Bacon"}), (charlize:Person {name:"Charlize Theron"})
MATCH p= shortestPath( (kevin)-[:ACTED_IN*]-(charlize) )

WITH nodes(p)+rels(p) AS c, length(p) AS l 
RETURN [x IN range(0,l) | [c[x]).name + type(c[l+x+1])]]

非常好。学习 Clojure 后,我猜测 reduce 函数是我的第二个选择,但我无法弄清如何将节点与关系集合结合起来。现在我更了解 Neo4j 的工作原理了。 - user3114859
为什么需要写成(c[x]).name而不是c[x].name?为什么c[x].name无法工作?我在手册中没有找到这方面的例子(在文本版本中搜索“]).”)。 - user3114859

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接