Neo4j中的Cypher语言

3

我试图创建两个可选匹配的并集(如下所示),但是得到的结果却是两个交集。 我应该如何更改此查询以获得所需的并集?

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)

这个图形数据库旨在模拟社交网络。通过第一次可选匹配,我试图找到用户(Smith)网络中的二度连接,并计算它们作为他网络中的二度连接出现的次数。第二次匹配对三度连接执行同样的操作。
但是查询返回的是两个可选匹配的交集,而不是它们的并集,也就是说,我只获得那些可以映射为用户(Smith)的二度和三度连接的名称计数。
相反,我想要得到所有二度和三度连接的名称以及计数。如何修改此查询以获得所需的结果?
2个回答

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. 匹配“smith”
  2. 可选地匹配“smith”的第二度人脉
  3. 收集第二度人脉
  4. 可选地匹配“smith”的第三度人脉
  5. 收集第三度人脉
  6. 返回第二和第三度人脉的收集,以及每个收集的大小。

以下是建议的查询

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

如果您确实想要联合这两个不同的查询,您需要为每个部分编写一个返回语句,匹配列并使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接