我是neo4j的新手,正在研究电影示例。我一直试图在Kevin Bacon和Meg Ryan查询之间做经典的最短路径,但也改变了列的输出。下面的查询有两种不同的方法。第一栏我不明白为什么它不起作用。所以我有两个问题。
使用示例返回尝试进行查询:
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN
[n in nodes(p) | case when labels(n) = 'Person' then n.name when labels(n) = 'Movie' then n.title end ],
[a in nodes(p) where has(a.name) | a.name],
[b in nodes(p) where has(b.title) | b.title]
这样做的结果是(道歉没有发布图片的赞誉)
首选输出Kevin Bacon,A Few Good Men,Tom Cruise,Top Gun,Meg Ryan
答案 0 :(得分:2)
硬编码解决方案是使用COALESCE()
:
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN EXTRACT(x IN NODES(p) | COALESCE(x.name, x.title))
输出:
Kevin Bacon, A Few Good Men, Tom Cruise, Top Gun, Meg Ryan
但这只有效,因为我们知道Movie节点没有name
属性。如果他们出于某种原因......
MATCH (m:Movie) SET m.name = "Something Unrelated"
然后上面会失败,我们会得到:
Kevin Bacon, Something Unrelated, Tom Cruise, Something Unrelated, Meg Ryan
因此,更通用的解决方案是:
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN EXTRACT(
x IN NODES(p) | CASE WHEN x:Person THEN x.name
WHEN x:Movie THEN x.title
END
)
您的尝试
[n in nodes(p) | case when labels(n) = 'Person' then n.name when labels(n) = 'Movie' then n.title end ]
非常接近,但LABELS()
会返回一个集合,因此您需要检查字符串是否为IN LABELS()
,而不是LABELS()
等于字符串。