2017-01-10 9 views
3

私は2つのオプションのマッチを(以下に示すように)作成しようとしましたが、ユニオンの代わりに2つの交点が得られます。 必要な共用体を取得するために、このクエリをどのように変更する必要がありますか?Cypher for neo4j

optional match (a:PA)-[r2:network*2]-(b:PA) where a.last_name='smith'  
And Not (a:PA)-[:network]-(b:PA) 
optional match (a:PA)-[r3:network*3]-(b:PA) where a.last_name='smith' 
And Not (a:PA)-[:network]-(b:PA) 
return b.first_name, count(r2), count(r3) 

このグラフデータベースは、社会的network.Through私は、ユーザーの(スミス)ネットワークと、彼らは第二度として現れる倍の数の二度の接続を見つけることを試みた最初のオプションの試合を模倣することになっています彼のネットワークでの接続。 2度目の一致は3度目の接続でも同じです。

しかし、この照会では、2つのオプションの一致の組み合わせが返されています。つまり、2度と3度の両方の接続としてマップできる名前のみがカウントされています。ユーザー(smith)。

代わりに、第2度と第3度のすべての接続の名前を数えたいと思います。 このクエリを修正して必要な結果を得るにはどうすればよいですか?

答えて

3

私はあなたの場合には労働組合が必要とされていないと思う:

match path = (a:PA {last_name: 'smith'})-[r2:network*2..3]-(b:PA) 
where not (a:PA)-[:network]-(b:PA) 
with b.first_name as name, 
    CASE WHEN length(path) = 2 THEN 1 ELSE 0 END as deg2 
    CASE WHEN length(path) = 3 THEN 1 ELSE 0 END as deg3 
RETURN name, sum(deg2), sum(deg3) 
0

私はあなたが後になっているかもしれないと思いますが、次のようなクエリです。それはありません、以下:

  1. 試合スミス
  2. 、必要に応じて
  3. は、第二度の接続を収集・スミスの第二度PAと一致
  4. 、必要に応じて
  5. が3ND度接続を収集・スミスの第3回学位PAと一致
  6. 第2および第3度PAのコレクションをそれぞれのサイズとともに返す。あなたは列とUNION ALLのマッチング、各半分のためのreturn文を必要とする二つの異なるクエリには、実際に労働組合たかった場合

ここでは、提案されたクエリ

match (a:PA) 
where a.last_name='smith'  
with a 
optional match (a)-[r2:network*2]-(b:PA) 
where Not (a)-[:network]-(b) 
with a, collect(b.first_name) as 2_deg 
optional match (a)-[r3:network*3]-(b:PA) 
where Not (a)-[:network]-(b) 
return 2_deg, collect(b.first_name) as 3_deg, size(2_deg) as num_2_deg, size(3_deg) as num_3_deg 

です。ここにサンプルがありますが、私はそれがあなたが求めているものだとは思わない。

optional match (a:PA)-[r2:network*2]-(b:PA) 
where a.last_name='smith'  
And Not (a:PA)-[:network]-(b:PA) 
return b.first_name, count(r2) as num 
UNION ALL 
optional match (a:PA)-[r3:network*3]-(b:PA) 
where a.last_name='smith' 
And Not (a:PA)-[:network]-(b:PA) 
return b.first_name, count(r3) as num