2014-05-13 26 views
0

我想解决这个问题,但它仍然有问题..好吧,我的查询有点复杂,因为我使用提取,短路径和过滤器。当我尝试下面这段代码,它返回过滤器需要在那里..Cypher中的提取和过滤

match (actor:Actor{name:"XXXX"}),(reeves:Actor{name:"YYYY"}), 
p= shortestPath ((actor)-[*..20]-(reeves)) 
where "Reeves, Keanu"=filter(n2 in nodes(p):n.name) 
return distinct extract(n in nodes(p)|n.name) as Names; 

但你看到有“其中”关键字。

,我试图像

match (actor:Actor{name:"XXXX"}),(reeves:Actor{name:"YYYY"}), 
p= shortestPath ((actor)-[*..20]-(reeves)) 
WHERE NOT ALL (x IN nodes(p) 
     WHERE x.name<> "YYYY") 
return distinct extract(n in nodes(p)|n.name) as Names; 

但是这一次,我仍然得到“里夫斯,基努”的名字。我想从我的结果过滤这个名字..

我在哪里做一个失误?

+0

请记住,“过滤器”用于返回“过滤下来”的集合。 至于你的问题,你能澄清一下吗? “YYYY”应该是“Reeves,Keanu”还是不? – BtySgtMajor

回答

1

如果你想找出包含名称“YYYY”的最短路径,尝试:

MATCH (actor:Actor{name:"XXXX"}), (reeves:Actor{name:"YYYY"}), 
    p = shortestPath ((actor)-[*..20]-(reeves)) 
WHERE any(n2 in nodes(p) WHERE n2.name="YYYY") 
RETURN distinct extract(n in nodes(p) | n.name) as Names; 

在另一方面,如果你想忽略含有该名称的最短路径“YYYY “:

MATCH (actor:Actor{name:"XXXX"}), (reeves:Actor{name:"YYYY"}), 
    p = shortestPath ((actor)-[*..20]-(reeves)) 
WHERE none(n2 in nodes(p) WHERE n2.name="YYYY") 
RETURN distinct extract(n in nodes(p) | n.name) as Names; 

顺便说一句,请注意如何anynone谓词内部需要WHERE clause