如何过滤某些节点以发现路径

时间:2019-06-11 10:02:51

标签: graph neo4j cypher nodes shortest-path

我一直在研究Movie Graph数据集,我想找到两个actor之间的最短路径,但是省略了Movie节点(节点可以具有标签Person或Movie)。

此查询返回从Kevin Bacon到Meg Ryan的最短路径:

MATCH p=shortestPath((bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})) 
RETURN p

我现在想排除电影节点,但是如何?这是我想出的,但是不幸的是,它没有产生任何结果:

MATCH path=shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) )
WITH nodes(path) AS ns
WHERE 
  ALL(node IN ns 
    WHERE NOT node:Movie)
RETURN ns AS path_without_movies;

执行查询,但仅显示以下结果:

  

“(无更改,无记录)”。

有什么想法可以改善查询条件吗?

2 个答案:

答案 0 :(得分:1)

要通过标签路径上过滤节点,您可以按以下方式修改查询:

MATCH (bacon:Person {name:"Kevin Bacon"}), (meg:Person {name:"Meg Ryan"})
MATCH path=shortestPath( (bacon)-[*]-(meg) )
WHERE 
  ALL(node IN nodes(path) 
    WHERE NOT 'Movie' IN labels(node))
RETURN path AS path_without_movies;

OR

MATCH (bacon:Person {name:"Kevin Bacon"}), (meg:Person {name:"Meg Ryan"})
MATCH path=shortestPath( (bacon)-[*]-(meg) )
WHERE 
  ALL(node IN nodes(path) 
    WHERE NOT node:Movie)
RETURN path AS path_without_movies;

答案 1 :(得分:1)

第二个查询的问题是关键字WITH在查询中创建了逻辑分区。

因此,如果您删除了行WITH nodes(path) AS ns,则在比赛期间将应用以下WHERE。在这一行中,Cypher正在查找匹配结果,而不是从该列表中删除结果。 (通常这种差异并不明显,但是最短路径会减少结果,从而改变最终结果)

正如Raj's answer所指出的,您只需将提取(nodes(path))从WITH移到ALL即可避免分区。

MATCH path=shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) )
WHERE 
  ALL(node IN nodes(path)
    WHERE NOT node:Movie)
RETURN nodes(path) AS path_without_movies;