我想要一个代码片段,它会生成特定客户端的ID以及通过以下关系链接到此客户端的客户端节点数。以下代码在我的neo4j db中生成客户端的id:
MATCH (c1:Client {AtlasId:'F2A9452F-9B57-4F13-B314-0E4F63E04D0A'})
RETURN id(c1) as clientid
大。以下内容产生以某种方式链接到c1的客户端节点数:
MATCH (c1:Client {AtlasId:'F2A9452F-9B57-4F13-B314-0E4F63E04D0A'})-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(m {AllowDuplication:false})-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(c2:Client {CountryRefId:1})
WITH COUNT(DISTINCT c2) as C2Count
RETURN C2Count
也很棒。两段代码,做我想要的。现在我加入以上内容:
MATCH (c1:Client {AtlasId:'F2A9452F-9B57-4F13-B314-0E4F63E04D0A'})
WITH id(c1) as clientid, c1
MATCH (c1)-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(m {AllowDuplication:false})-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(c2:Client {CountryRefId:1})
WITH COUNT(DISTINCT c2) as C2Count, clientid
RETURN clientid, C2Count
但答案是(没有行)。以下至少产生C2Count = 0(这是我所期望的,因为这个客户端没有):
MATCH (c1:Client {AtlasId:'F2A9452F-9B57-4F13-B314-0E4F63E04D0A'})
WITH id(c1) as clientid, c1
MATCH (c1)-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(m {AllowDuplication:false})-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(c2:Client {CountryRefId:1})
WITH COUNT(DISTINCT c2) as C2Count
RETURN C2Count
即使没有链接节点,我如何能够始终如一地获取ID号和链接节点数?
任何帮助表示感谢。
答案 0 :(得分:3)
问题在于,当您执行匹配并且没有匹配时,到目前为止已构建的所有行都将被清除。匹配在模式上不匹配,因此没有结果。如果你执行了两个匹配然后立即返回c1
,你会看到同样的事情:没有行,因为即使你之前匹配c1
,它也不符合下一个匹配,它不是有效的结果,因此不会产生任何行。
即使没有行,您仍然可以执行聚合(如您所见,执行count()
,结果为0;执行collect()
应该为您提供空集合)。但是您无法从不存在的节点获取属性值。您之前在结果行中显示的任何属性值都不再存在,因为结果中没有行。
你需要的是一个OPTIONAL MATCH,如果匹配失败,OPTIONAL MATCH中引入的变量将为null,但你的行将保持不变。
MATCH (c1:Client {AtlasId:'F2A9452F-9B57-4F13-B314-0E4F63E04D0A'})
WITH id(c1) as clientid, c1
OPTIONAL MATCH (c1)-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(m {AllowDuplication:false})-
[:`used email address`|:`was at`|:`used idnumber`|:`used`|:`used account`|:`used cellnumber`]-
(c2:Client {CountryRefId:1})
WITH COUNT(DISTINCT c2) as C2Count, clientid
RETURN clientid, C2Count