2016-12-20 55 views
0

这里是我的暗号查询:可选匹配的Neo4j

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; 

“一个”节点是用户节点,“A”可以张贴照片,跟随其他用户,像其他用户的照片,非常像的Instagram。这里发生的是,只有在节点a和b>之间的关系 - [p:POSTS]存在时,它才会给followRequestStatus(f.followRequestStatus)正确。如果关系'p'不存在,即使关系f存在,也会为关系>'f'返回null。

+0

你的实际问题对我来说不是很清楚。你问如何实现followRequestStatus的正确输出?并且由于'b'是一个新引入的变量(来自'a'的帖子),我正确的是,只要'a'发布了一些东西(这可以通过postIds的集合检测不到的东西),输出followRequestStatus空着)? – InverseFalcon

+0

followRequestStatus必须与是否已发布任何内容无关,它可以为null,0或1,但在这种情况下,对于其不能匹配的所有条件(a) - [p:POSTS] - >(b) ,followRequestStatus作为null出现,即使它具有某些值。 –

+0

好的,明白了。我错误地将你的描述误解为你的要求而不是问题。 – InverseFalcon

回答

2

您是否尝试过分离的两个可选的匹配模式为两个独立的可选匹配?

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

在从显影剂文档OPTIONAL MATCH描述:

的差[相比MATCH]是,如果没有找到匹配, OPTIONAL MATCH将使用一个空值的丢失部分模式。

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