我正在尝试生成一个数组,其中包含使用OPTIONAL MATCH子句从员工发送到所有人的消息数(如果有,则为零,如果没有通信),但它不起作用。当没有通信时,我没有在数组中得到零。我使用以下查询:
MATCH(e:Employee{key:101,div:'finance'}),(b:Employee)
OPTIONAL MATCH (e)-[r:Message]->(b)
WITH e.name as em, r.NUMBER_OF_MESSAGES as msg
ORDER BY msg DESC
RETURN em, COLLECT(msg) AS row
这是输出:
Row: [31,20,12,10,8,7,7,2,2,2,2,1,1,1]
我在这里做错了什么?提前谢谢。
答案 0 :(得分:2)
此处的问题是https://jsfiddle.net/qcbrf1jf/1/将收集所有值忽略空值。当两个节点之间没有通信时,msg
变量的值将为null
,因此被COLLECT()
忽略。要解决此问题,请将查询更改为:
MATCH(e:Employee{key:101,div:'finance'}),(b:Employee)
OPTIONAL MATCH (e)-[r:Message]->(b)
WITH e.name as em, coalesce(r.NUMBER_OF_MESSAGES,0) as msg
ORDER BY msg DESC
RETURN em, COLLECT(msg) AS row
此查询使用collect()函数。此函数将返回传递给它的参数列表中的第一个非null值。然后,如果r.NUMBER_OF_MESSAGES
为null
,则它将被替换为零。