Neo4j 有没有办法从节点返回白名单或黑名单属性?

Neo4j 有没有办法从节点返回白名单或黑名单属性?,neo4j,cypher,Neo4j,Cypher,在neo4j中返回的节点似乎很特别,因为它们输出为JSON对象,如果为null,则根本不显示 例如: 我有一个:Person对象,它们可以与另一个:Person有0个或多个:朋友关系 假设:Person具有以下属性:ID、firstName、lastName、sensitiveThing sensitiveThing是一个属性,它可能被我们的系统使用,或者用户自己可以亲自访问,但我们不想将它返回给任何其他用户 如果我想要一个查询返回我朋友的数据,以及这些朋友的朋友的数据,我可能会使用这样的查询

在neo4j中返回的节点似乎很特别,因为它们输出为JSON对象,如果为null,则根本不显示

例如: 我有一个:Person对象,它们可以与另一个:Person有0个或多个:朋友关系

假设:Person具有以下属性:ID、firstName、lastName、sensitiveThing

sensitiveThing是一个属性,它可能被我们的系统使用,或者用户自己可以亲自访问,但我们不想将它返回给任何其他用户

如果我想要一个查询返回我朋友的数据,以及这些朋友的朋友的数据,我可能会使用这样的查询

MATCH (me:User{ID:777})-[:Friend]-(friend:User)
WITH me, friend
OPTIONAL MATCH (friend)-[:Friend]-(foaf:User)
WHERE me <> foaf
RETURN friend.ID, friend.firstName, friend.lastName, COLLECT(foaf) AS FriendOfAFriend
然后我得到我想要的…直到我遇到了没有朋友的朋友的情况。当我以前处理节点时,对象甚至不会被发射。但是现在,我会得到这样的东西:

[{ID: (null), firstName: (null), lastName: (null)}]
这显然不是我想要的

理想情况下,我正在寻找一种像以前一样返回节点的方法,但我希望发出白名单或黑名单属性,以便在节点为null(来自可选匹配)时保留正确的null处理

如果我不能这样做,那么我想要一种使用自定义对象的方法,但如果对象的所有字段都为空,则根本不返回该对象


处理可选匹配的任何其他解决方法或技巧都非常受欢迎。

我从未在文档中看到过白名单或黑名单属性的方法

但是,您可以通过链接
collect
extract
返回自定义对象:

MATCH (me:User{ID:777})-[:Friend]-(friend:User)
WITH me, friend
OPTIONAL MATCH (friend)-[:Friend]-(foaf:User)
WHERE me <> foaf
WITH friend, collect(foaf) AS FriendOfAFriend
RETURN friend.ID, friend.firstName, friend.lastName,
       extract(foaf in FriendOfAFriend | {ID:(foaf.ID), firstName:(foaf.firstName), lastName:(foaf.lastName)}) AS FriendOfAFriend
MATCH(me:User{ID:777})-[:Friend](Friend:User)
跟我来,朋友
可选匹配(friend)-[:friend](foaf:User)
我在哪里
和朋友一起,收集(foaf)作为朋友的朋友
返回friend.ID,friend.firstName,friend.lastName,
提取(FriendOfAFriend |{ID:(foaf.ID),firstName:(foaf.firstName),lastName:(foaf.lastName)})中的foaf作为FriendOfAFriend
如果没有朋友,
collect
将返回一个空列表,
extract
将保持此状态。

您可以使用:


正是我想要的,谢谢!这是我在文档中没有研究过的东西之一。
MATCH (me:User{ID:777})-[:Friend]-(friend:User)
WITH me, friend
OPTIONAL MATCH (friend)-[:Friend]-(foaf:User)
WHERE me <> foaf
WITH friend, collect(foaf) AS FriendOfAFriend
RETURN friend.ID, friend.firstName, friend.lastName,
       extract(foaf in FriendOfAFriend | {ID:(foaf.ID), firstName:(foaf.firstName), lastName:(foaf.lastName)}) AS FriendOfAFriend
WITH {p1: 1, p2: 2, p3: 3, p4: 4} as node
CALL apoc.map.removeKeys( node, ['p2', 'p4'] ) YIELD value
RETURN value