可选匹配Neo4j

时间:2016-12-20 12:18:45

标签: node.js neo4j cypher

这是我的密码查询:

MATCH (a : User), (user : User {username : 'lebron'}) 
WHERE a.phoneNumber IN ['757488374748','+9035115','+90390320303'] 
  AND a.username <> 'lebron' 
OPTIONAL MATCH (user)-[f:FOLLOWS]->(a), (a)-[p : POSTS]->(b) 
RETURN DISTINCT COLLECT(b.postId) AS postId, a.username AS membername, 
  f.followRequestStatus AS followRequestStatus, user.private AS userPrivate;

&#39;一个&#39;节点是用户节点,&#39; a&#39;可以发布照片,跟随其他用户,像其他用户的照片,非常像instagram。这里发生的是,只有当节点a和b之间的关系 - [p:POSTS]&gt;时才会使followRequestStatus(f.followRequestStatus)正确。存在。如果关系&#39; p&#39;如果不存在,则为关系&gt;返回null &#39; F&#39;即使关系f存在,也是如此。

1 个答案:

答案 0 :(得分:2)

您是否尝试将两个可选匹配模式分成两个独立的可选匹配?

...
OPTIONAL MATCH (user)-[f:FOLLOWS]->(a)
OPTIONAL MATCH (a)-[p : POSTS]->(b) 
...

在开发者文档的OPTIONAL MATCH描述中:

  

差异[与MATCH相比]是如果没有找到匹配,   OPTIONAL MATCH将使用null来表示模式的缺失部分。

当您使用由逗号分隔的两个单独的模式时,我的假设是如果找不到两个匹配项,则null将用于模式的所有部分。既然你想要:FOLLOWS关系,即使没有:来自a的POSTS,你需要单独的OPTIONAL MATCH。