让我们说我有以下数据模型:
(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
显然它不会起作用,因为权限是属性映射而不是数组,我需要以某种方式访问它的键和值。
我正朝着正确的方向前进吗?我怎样才能实现我想要的目标?答案 0 :(得分:1)
您可以单独传递permissions
变量的每个属性。
MATCH (u:User)-[r:HAS_PERMISSIONS { view: {view}, create: {create} }]->(n) RETURN u
然后传递参数view
和create
。
如果您不知道权限属性可能是什么,您可以在应用程序中处理它。在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'