2017-01-10 72 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