我有一个端点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
在运行查询的其余部分之前存在,以便我有一个有用的响应来告诉控制器/用户?
答案 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