我是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
}
答案 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