如何在Neo4j/Cypher中返回复合对象

Dav*_*lls 5 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'}]
 }
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}