2017-03-14 8 views
2

特定のクライアントのIDと、以下の関係を介してこのクライアントにリンクされたクライアントノードの数を生成する単一のコードスニペットが必要です。次のコードは、クライアントのIDをmy neo4j dbに生成します。予期しない(行がない)結果がcypher

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 

また、素晴らしいです。私がしたいことをする2つのコード。今私は上記のように参加する:

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番号とリンクされたノードの数を取得する方法リンクノードはありませんか?

助けてください。

答えて

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 
+0

偉大な答え、ありがとう。 – user152992