如何在Neo4j / Cypher

时间:2016-06-17 09:35:23

标签: neo4j cypher

我想使用cypher从Neo4j返回一个复合对象来整理我的查询。

举一个例子,我有一个用户帐户对象,其权限存储为关系。权限是复杂的对象,因此无法嵌套,现在它们通过关系[:HAS_PERMISSION]链接。我想要做的是返回已经嵌套的权限的完整复杂对象,如下面的示例JSON对象

e.g.

permissions:
{
    action:'delete', 
    resource:'blog posts'
}
{
    action:'edit', 
    resource:'users'
}   

core user account:
{
  username:'Dave',
  email:'dave@test.com'
}

What i'd like:
 {
  username:'Dave',
  email:'dave@test.com'
  permissions: [{action:'delete', resource:'blog posts'},{action:'edit', resource:'users'}]
 }

我目前的查询:

MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission)
WITH {user:user, permissions:collect(permission)} AS UserAccount
RETURN UserAccount

问题是这并不能完全归还我之后的事情,它会返回:

{
     user: {
     username:'Dave',
     email:'dave@test.com'
     },
     permissions: [{action:'delete', resource:'blog posts'},{action:'edit', resource:'users'}]
 }

请注意:我非常希望将权限列表添加到现有用户对象,我将返回。我想知道如何保存我必须在新对象上明确声明我需要的所有属性(如果可能的话)。

3 个答案:

答案 0 :(得分:11)

您可以根据需要设计对象:

MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission)
WITH { username:user.username, 
       email: user.email, 
       permissions:collect(permission)
     } AS UserAccount
RETURN UserAccount

<强>更新

您可以使用apoc.map.setKey:

MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission)
WITH user, collect(permission) as permissions
CALL apoc.map.setKey( user, 'permissions', permissions ) YIELD value as UserAccount
RETURN UserAccount

答案 1 :(得分:6)

从Neo4J 3.1开始,您可以使用Map投影 MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission) WITH user, collect(permission) as permissions RETURN user{ .*, permissions: permissions}

答案 2 :(得分:0)

您可以使用set关键字在任何对象中设置属性,我们可以利用此优势。 然而,Neo4j只允许我们将原始数组存储为属性中的集合,并且不允许我们存储地图,例如

  

[{action:'delete',resource:'blog posts'},{action:'edit',   资源: '用户'}]

因此我们需要稍微简化您的权限节点模型。

你最终得到的是

  

{username:'Dave',电子邮件:'dave@test.com'权限:['删除   博客文章','编辑用户']}

优点是您可以只使用一个对象中的所有内容并获取整个UserAccount节点的内容。

constexpr

TLDR :可以在不格式化整个对象的情况下获取数据,例如@ stodb的示例。但是这种方法不能输出复杂的地图集合,只能输出原始数组作为集合。