找出一条路径,要求这条路径中的所有结点都与CA结点有Belong关系
我遇到的问题是这样,我需要查询结点A与结点B之间的路径,要求这个路径上经过的结点都要与CA结点有Belong关系。我使用下面的语句是可以完成要求
MATCH p=(a:Member {uuid:'rdy988TR'}) -[:KNOWS|:FRIEND*1..4]- (b:Member {uuid:"rdVJ5fgB"}),
(ca:Company {company_id:"wxtd2"})<-[:BELONG]-(d)
WITH p, nodes(p) as pm_nds, collect(d) as pb_nds
WHERE all(x IN pm_nds WHERE x in pb_nds)
return p
当d结点达到w级别时,效率太低了,我试用使用另一种表达
match p=(a:Member {uuid:"rdy988TR"})-[:KNOWS|:FRIEND*1..4]-(b:Member {uuid:"rdVJ5fgB"}),(ca:Company {company_id:"wxtd2"})
WITH NODES(p) AS nds,p,ca
UNWIND nds AS u_nds
where (ca)<-[:BELONG]-(u_nds)
return p
但这种方式是执行不了…想问一下有没有更好的 表达方式? 或者我第二种方式为什么错误?
2 回复
在你的第一种写法中,两个MATCH的结果会交叉组合(笛卡尔积)后返回,这样造成太多重复路径。试试这样写: MATCH p=(a:Member {uuid:‘rdy988TR’}) -[:KNOWS|:FRIEND*1…4]- (b:Member {uuid:“rdVJ5fgB”}) , (ca:Company {company_id:“wxtd2”}) WITH p, nodes§ as pm_nds WHERE ALL(x IN nodes[1…-1] WHERE exists ((x) -[:BELONG]-> (ca))) RETURN p
nodes[1…-1]表示不包括路径的开始和结束节点,即a和b。