让我们考虑一个简单的例子,有两种类型的节点:公司和工人。对于任何一对公司c1和c2(我尊重一些我将忽略的条件),我需要知道:1.他们有多少共同工人,有多少工人有c1,有多少工人有c2。Neo4j Cypher路径使用几次相同的边
我的第一个猜测是:
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)(ID为w_c2)之间只有一个链接就只算c1中不属于c2的工作人员。但是如果我在一些节点之间有几个关系,结果有时候是“正确的”。这听起来像比赛中的路径不会“回来”:(w_common) - (c2:公司) - (w_c2:工人)将不匹配(“worker1”) - (“company2”) - ( “worker1”)(这可能有助于避免无限循环)。
我的第二个猜测是两个部分分割的要求: 我的第一个猜测是:
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)
不过,结果是正确的,但我有一个关于笛卡尔积的警告,而事实上,在大数据集,我的请求不会在数小时后完成。我在两场比赛之间尝试了“WITH c1,w_common,c2”,但我仍然有警告
我该如何继续?
谢谢,我确实尝试了SIZE函数,但是我可能在给定的公司和工人之间有几个关系(例如对应于几个工作阶段)。 – Vandy
您是否有特定的“:HIRED”,每个工人只能出现一次?然后你可以做一些像'size((c1) - [:HIRED] - >())'。 –