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

时间:2019-05-13 07:00:36

标签: neo4j cypher graph-databases

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

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

目前是否可以通过密码实现?

编辑:

在我的第一个测试中似乎可以使用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参数是NULL时,这些关系才会出现。

对于经验丰富的密码使用者来说,任何建议或改进都是很棒的。

1 个答案:

答案 0 :(得分:2)

此简化的查询将为liked属性返回一个布尔值,并且每个m仅返回一个结果:

MATCH (m:Media {mediaId: $itemId})
OPTIONAL MATCH (m)<-[r:LIKED]-(:Person {userId: $userId})
WHERE exists(r.createdAt)
RETURN m { .*, labels:labels(m), liked: COUNT(r)>0 } AS result;

最重要的变化是使用aggregating function COUNT()

如果您不需要测试createdAt属性的存在,那么这个更简单的查询将起作用:

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