如果 neo4j 密码中存在参数,您可以进行可选匹配吗?

can you do an optional match if a parameter exists in neo4j cypher?

当用户通过身份验证时,我想扩展我的密码查询以包括用户是否与项目节点有 :LIKED 关系,并将其作为布尔值包含在我的投影中。

如果用户通过身份验证,我将提供 {userId},或者 {userId} 参数将为空。我调查了 WHEREexists 但这似乎不是正确的方法。

目前这在 cypher 中完全可行吗?

编辑:

在我的第一次测试中使用 OPTIONAL MATCH 这似乎是可行的,但这是正确的方法吗?

  MATCH (m:Media {mediaId: {itemId}})
  WITH m, labels(m) as labels
    OPTIONAL MATCH (m)<-[r:LIKED]-(:Person {userId: {userId}})
    RETURN m { .*, labels, liked: exists(properties(r).createdAt) } AS result
      LIMIT 1

最后,我可能有几个关系,只有在发出请求的用户经过身份验证并且 userId 参数为 nit 时才会存在这些关系 NULL.

任何有经验的密码用户的建议或改进都会很棒。

[已编辑]

如果您不需要测试 createdAt 属性 是否存在,那么这个更简单的查询就可以工作:

MATCH (m:Media {mediaId: $itemId})
RETURN m { .*, labels:labels(m),
  liked: EXISTS((m)<-[:LIKED]-(:Person {userId: $userId})) } AS result;