在继续neo4j中的其余查询之前,检查节点存在

时间:2016-02-14 16:23:50

标签: graph neo4j cypher

我有一个端点getAlbumsByUserId,您可以想象,返回用户创建的所有相册。

我有查询工作,它返回正确的节点:

"MATCH (u:User "+user+")",
"MATCH (m:User {uuid: '"+userId+"'})",
"OPTIONAL MATCH (m)-[:CREATED]->(n:Asset:Album)<-[r:CAN_READ]-()<-[:BELONGS_TO]-(u)",
"RETURN DISTINCT collect(n) AS nodes, collect(m) AS user",
"UNION",
"MATCH (m:User {uuid: '"+userId+"'})",
"OPTIONAL MATCH (i:User "+user+")-[f:CREATED]->(n:Asset:Album)",
"RETURN DISTINCT collect(n) AS nodes, collect(m) AS user"

此查询的作用是查找用户Albums创建的所有(m)以及用户(u)可以根据其与可以读取{{1 }}

由于Album:CAN_READ之间没有直接的User关系,而且Album无法读取每个Album,我需要还会检查与发出请求的Role:CREATED关系的相册。

有没有一种简单的方法来检查

User

在运行查询的其余部分之前存在,以便我有一个有用的响应来告诉控制器/用户?

1 个答案:

答案 0 :(得分:0)

首先,我会使用Cypher Parameters而不是直接将数据连接到字符串中以防止注入攻击。

我认为您需要将前两个MATCH子句合并为一个:

MATCH (u:User {uuid: {userId}}), (m:User {uuid: {currentUserId}})

这意味着如果找到该子句中的所有内容,您将只获得匹配。

另见What does a comma in a Cypher query do?

如果这不起作用,您可能首先只获取当前用户有权访问的所有专辑,然后与给定用户匹配(简化查询):

MATCH (current_user:User {uuid: {currentUserId}})-[:BELONGS_TO]->()-[:CAN_READ]->(album:Asset:Album)
WITH album
MATCH (user:User {uuid: {userId}})-[:CREATED]->(album)
RETURN album