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

Neo4j 如何匹配作为查询参数传递的多个属性的关系?,neo4j,cypher,Neo4j,Cypher,假设我有以下数据模型: (用户)-[r:HAS_PERMISSIONS]->(n)“r”的属性是布尔值中的权限,如view=true、create=true 我要查找对某个实体具有特定权限的所有用户, 它们作为查询参数传递 我天真地想要这样的东西: MATCH(u:User)-[r:HAS_PERMISSIONS{PERMISSIONS}]->(n)返回u, 我知道这是不正确的,因为{permissions}只能用于CREATE语句 传递的权限参数是一个映射,类似于{view:true} 我现在

假设我有以下数据模型:

(用户)-[r:HAS_PERMISSIONS]->(n)
“r”的属性是布尔值中的权限,如view=true、create=true

我要查找对某个实体具有特定权限的所有用户, 它们作为查询参数传递

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

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

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

我现在想的是:

MATCH(u:User)-[r:HAS\u PERMISSIONS]->(n)
其中ALL(p在{permissions}中,其中r.{p}={permissions}.p)
返回u

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


我的方向对吗?如何实现所需功能?

您可以独立地传递
权限
变量的每个属性

MATCH (u:User)-[r:HAS_PERMISSIONS { view: {view}, create: {create} }]->(n) RETURN u
然后传入参数
查看
创建

如果您不知道权限属性可能是什么,您可以在应用程序中处理它。在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'

如果我事先不知道可用权限集怎么办?那又是另一回事了。;-)如果您能够将权限放入参数中,则在转到服务器之前,它必须存在于您的应用程序中的某个位置。你能在你的应用程序中处理这个问题吗?我正在考虑编写一个通用查询,如果将来添加了新的权限,就不必更改它,一个简单地匹配作为参数给定的所有权限的查询。如果你在像
{create:true}
这样的散列中传递参数,你仍然可以在应用程序中处理它。我用一个例子修改了我的答案,演示了如何使用Ruby来处理它,但是无论使用哪种语言,都可以使用相同的想法。只需创建一个方法/函数,将权限散列转换为适合cypher的内容。如果存在,我很乐意看到它!