簡體   English   中英

neo4j cypher交織節點和關系

[英]neo4j cypher interleave nodes and relationships

如何返回交錯的節點和關系? 使用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
    ...

這曾經更容易,但是當他們在Cypher中制作Paths not Collections時,他們打破了2.0-RC1中的“簡單方法”。

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))]

改變的好處是Paths現在更加類型安全,雖然我同意它們有一點令人信服。 這種查詢的真實用例之間的差距很小。

這是另一個解決方案:

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])]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM