意外(没有行)导致密码

时间:2017-03-14 18:44:40

标签: neo4j cypher

我想要一个代码片段,它会生成特定客户端的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号和链接节点数?

任何帮助表示感谢。

1 个答案:

答案 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