我想使用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'}]
}
请注意:我非常希望将权限列表添加到现有用户对象,我将返回。我想知道如何保存我必须在新对象上明确声明我需要的所有属性(如果可能的话)。
答案 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的示例。但是这种方法不能输出复杂的地图集合,只能输出原始数组作为集合。