【问题标题】:Check node exists before continuing with rest of query in neo4j在继续进行 Neo4j 中的其余查询之前检查节点是否存在
【发布时间】:2016-02-14 16:23:49
【问题描述】:

我有一个端点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"

此查询的作用是查找用户(m) 可以创建的所有Albums 以及用户(u) 根据其与可以读取Album 的角色的关系可以读取的内容

因为从UserAlbum 没有直接的:CAN_READ 关系,而且不是每个Album 都可以被Role 读取,我还需要检查具有:CREATED 关系的专辑发出请求的User

有没有简单的方法来检查

"MATCH (m:User {uuid: '"+userId+"'})"

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

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    首先我会使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2020-03-22
      • 2015-02-21
      • 2014-01-07
      • 2014-04-03
      相关资源
      最近更新 更多