2017-01-10 96 views
3

我試圖創建兩個可選匹配的聯合(如下所示),而不是工會,我得到了兩個交集。 我應該如何更改此查詢以獲取所需的聯合?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個可選匹配的交集,而不是它們的聯合即我得到的只有那些名稱可以映射爲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. 可選匹配史密斯的第二度PA
  3. 收集第二度連接
  4. 可選匹配史密斯的第三度PA
  5. 收集3ND程度連接
  6. 返回二級和三級PA的集合以及每個級別的大小。

這裏所提出的查詢

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 

如果您確實希望真正的工會,你需要一個return語句爲各佔一半,匹配的列和UNION ALL兩個不同的查詢。這裏是一個例子,但我不認爲這是你正在尋求的。

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