找出一条路径,要求这条路径中的所有结点都与CA结点有Belong关系
发布于 6 年前 作者 commissarster 1808 次浏览 来自 问答

我遇到的问题是这样,我需要查询结点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。

OK,谢谢,我是这么写的.

match p=(a:Member {uuid:"rdy988TR"})-[:KNOWS|:FRIEND*1..4]-(b:Member {uuid:"rdVJ5fgB"}),(ca:Company {company_id:"wxtd2"})
where all( n in NODES(p)[1..-1] where (n)-[:BELONG]-(ca))
return p,ca
回到顶部