如何匹配与作为查询参数传递的多个属性的关系?

时间:2014-10-09 13:49:53

标签: neo4j cypher

让我们说我有以下数据模型:

(User)-[r:HAS_PERMISSIONS]->(n)以及' r'的属性是布尔值的权限,如view = true,create = true。

我想找到对某个实体拥有某些权限的所有用户, 它们作为查询参数传递。

天真地我想要这样的东西:

MATCH (u:User)-[r:HAS_PERMISSIONS {permissions}]->(n) RETURN u, 我知道这不正确,因为{permissions}只能用于CREATE语句..

传递的权限参数是一个地图,类似于{view: true}

我现在想的是:

MATCH (u:User)-[r:HAS_PERMISSIONS]->(n) WHERE ALL(p in {permissions} WHERE r.{p} = {permissions}.p) RETURN u

显然它不会起作用,因为权限是属性映射而不是数组,我需要以某种方式访问​​它的键和值。

我正朝着正确的方向前进吗?我怎样才能实现我想要的目标?

1 个答案:

答案 0 :(得分:1)

您可以单独传递permissions变量的每个属性。

MATCH (u:User)-[r:HAS_PERMISSIONS { view: {view}, create: {create} }]->(n) RETURN u

然后传递参数viewcreate

如果您不知道权限属性可能是什么,您可以在应用程序中处理它。在Ruby中,我会做这样的事情:

def permissions_parameter(permissions)
  permission_keys   = []
  permission_values = []
  permissions.each do |k, v|
    permission_keys.push("r.#{k}: {#{k}}")
    permission_values.push("'#{k}': '#{v}'")
  end
  permission_keys_cypher = permission_keys.join(', ')
  permission_params_cypher = permission_values.join(', ')
  [permission_keys_cypher, permission_params_cypher]
end

permissions = permissions_parameter({ create: true, view: true })
puts "MATCH (u:User)-[r:HAS_PERMISSIONS { #{permissions[0]} }]->(n) RETURN u"
# MATCH (u:User)-[r:HAS_PERMISSIONS { r.create: {create}, r.view: {view} }]->(n) RETURN u
puts "params: #{permissions[1]}"
# params: 'create': 'true', 'view': 'true'