我想使用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'}]
}
Run Code Online (Sandbox Code Playgroud)
我目前的查询:
MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission)
WITH {user:user, permissions:collect(permission)} AS UserAccount
RETURN UserAccount
Run Code Online (Sandbox Code Playgroud)
问题是这并不能完全归还我所追求的,它会返回:
{
user: {
username:'Dave',
email:'dave@test.com'
},
permissions: [{action:'delete', resource:'blog posts'},{action:'edit', resource:'users'}]
}
Run Code Online (Sandbox Code Playgroud)
请注意:我真的想将权限列表添加到我要返回的现有用户对象中.我想知道如何保存我必须在新对象上显式声明我需要的所有属性(如果可能的话).
std*_*b-- 12
您可以根据需要设计对象:
MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission)
WITH { username:user.username,
email: user.email,
permissions:collect(permission)
} AS UserAccount
RETURN UserAccount
Run Code Online (Sandbox Code Playgroud)
更新
你可以使用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
Run Code Online (Sandbox Code Playgroud)
小智 6
从Neo4J 3.1开始,您可以使用Map投影
MATCH(user:UserAccount)-[:HasPermission]->(permission:Permission)
WITH user, collect(permission) as permissions
RETURN user{ .*, permissions: permissions}