cypher匹配查询合并结果集

时间:2016-12-29 13:51:02

标签: neo4j cypher

我是CQL的新手,如果我也跟着他的话,任何人都会帮我解决查询以找到有旗帜的粉丝列表。我是这样想的

MATCH (n:users_master)-[r:FOLLOW]->(m:users_master)
OPTIONAL MATCH (n:users_master)<-[r2:FOLLOW]-(m:users_master)   
CASE when EXISTS(r2) THEN n.flag= 1 ELSE n.flag=0 END  
where id(m)=35  
RETURN n

请注意,我还要在结果集中添加虚拟属性标志LIKE {"updated_at":"12/26/2016, 3:45:38 PM", "created_on":"12/26/2016, 3:45:38 PM", "last_name":"john", "first_name":"john", "email":"new@test", "facebook_id":"12341", "status":"Active", "id":35 "flag":1 }

1 个答案:

答案 0 :(得分:2)

EXISTS()函数可用于检查模式的存在,在您的情况下可以替换您的OPTIONAL MATCH。

此外,如果你不打算使用它们,你的模式中的变量是不需要的,所以你根本不需要你的关系。

MATCH (n:users_master)-[:FOLLOW]->(m:users_master)
WHERE id(m)=35  
RETURN n, EXISTS( (n)<-[:FOLLOW]-(m) ) as flag

&#39;标志&#39;将是一个单独的列,其中一个布尔值表示以下是否为倒数。

至于在Neo4j 3.1+中添加&#39;虚拟属性&#39;,您可以使用Map Projection将自定义值添加到返回节点的地图投影中。

您可以将此查询与地图投影一起使用,以在节点属性的返回中包含该标志:

MATCH (n:users_master)-[:FOLLOW]->(m:users_master)
WHERE id(m)=35  
RETURN n {.*, flag: EXISTS( (n)<-[:FOLLOW]-(m) ) }

修改

上面的查询中使用的地图投影已经引入,仅适用于Neo4j 3.1.x及更高版本。

对于版本3.0.x,我不相信有很多选项可以将所有节点属性提取到地图,并在返回之前向该地图添加新值(SET子句是为节点而不是地图保留的)。

您可能需要安装APOC procedures才能获得解决方法,因为它提供了多个帮助程序和功能,包括map operations

在将相关版本的APOC添加到您的Neo4j实例后,这应该有效:

MATCH (n:users_master)-[:FOLLOW]->(m:users_master)
WHERE id(m)=35  
RETURN apoc.map.setKey(properties(n), 'flag', EXISTS( (n)<-[:FOLLOW]-(m) )) as n