让我们考虑一个包含两种类型节点的简单示例:Company和Worker。对于任何一些公司c1和c2(尊重我将忽略的一些条件),我需要知道:1。他们有多少工人,有多少工人有c1,有多少工人有C2。
我的第一个猜测是:
MATCH (w_c1:Worker)--(c1:Company)--(w_common)--(c2:Company)--(w_c2:Worker)
WHERE <something>
RETURN c1, c2, COUNT(DISTINCT w_common), COUNT(DISTINCT w_c1), COUNT(DISTINCT w_c1)
该请求的问题在于,如果在任何一对连接节点之间只有一个链接,则COUNT(DISTINCT w_c1)(w_c2的id)仅计算c1的工作符,这与c2不相同。但是如果我在某些节点之间有几个关系,那么结果有时会是正确的&#34;。这听起来像是比赛中的路径没有&#34;回来&#34; :(w_common) - (c2:公司) - (w_c2:工人)将不匹配(&#34; worker1&#34;) - (&#34; company2&#34;) - (&#34; worker1&#34;)(这可能是有意义的,以避免无限循环)。
我的第二个猜测是将请求分为两部分: 我的第一个猜测是:
MATCH (c1:Company)--(w_common)--(c2:Company)
MATCH (c1)--(w_c1:Worker), (c2)--(w_c2:Worker)
WHERE <something>
RETURN c1, c2, COUNT(DISTINCT w_common), COUNT(DISTINCT w_c1), COUNT(DISTINCT w_c1)
但是,结果是正确的,但我对笛卡尔积有警告,事实上,在大数据集上,我的请求在下班后没有完成。我尝试使用&#34; WITH c1,w_common,c2&#34;在两场比赛之间,但我仍然有警告
我该怎么办?
答案 0 :(得分:1)
SIZE()函数可以帮助您,它可以告诉您模式的出现次数,例如:工人数:公司。
此查询可能对您有用,假设为公司工作的工人只与该公司有一个关系:
MATCH (c1:Company)--(w_common:Worker)--(c2:Company)
WHERE <your criteria for matching on a specific c1 and c2>
RETURN COUNT(w_common) as inCommonCount, SIZE( (c1)--(:Worker) ) as c1Count, SIZE( (c2)--(:Worker) ) as c2Count
答案 1 :(得分:1)
您可以使用小计:
OPTIONAL MATCH (C1:Company {name: 'c1'})
OPTIONAL MATCH (C2:Company {name: 'c2'})
WITH C1, C2
MATCH (C:Company)<-[:workto]-(W:Worker) WHERE C = C1 OR C = C2
WITH C1, C2, W,
sum(CASE WHEN C = C1 THEN 1 ELSE 0 END) as tmp1,
sum(CASE WHEN C = C2 THEN 1 ELSE 0 END) as tmp2
RETURN C1, C2,
sum(tmp1) as cc1, sum(tmp2) as cc2,
sum(tmp1 * tmp2 ) as common