从节点返回的白名单或黑名单属性的任何方法吗?

时间:2016-07-11 07:03:50

标签: neo4j cypher

在neo4j中返回的节点似乎很特殊,因为它们输出为JSON对象,如果它们为空,它们根本不会出现。

一个例子: 我有一个:Person对象,他们可以有0个或更多:朋友关系到另一个:Person。

让我们说a: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

虽然这可以让我很好地将朋友的朋友捆绑为JSON数组中的JSON对象,并且如果朋友除了我之外没有其他任何朋友,我会正确地发出一个空数组,我不想要使用此查询返回sensitiveThing。

如果我尝试用自定义对象替换COLLECT(foaf),只包括我关心的字段,如下所示:

COLLECT({ID:(foaf.ID), firstName:(foaf.firstName), lastName:(foaf.lastName)})

然后我得到我想要的东西......直到我遇到没有朋友的朋友的情况。当我以前使用节点时,对象甚至不会被发射。但现在,我会得到这样的东西回到我身边:

[{ID: (null), firstName: (null), lastName: (null)}]

这显然不是我想要的。

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

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

非常欢迎任何其他处理可选匹配的解决方法或提示。

2 个答案:

答案 0 :(得分:2)

您可以使用apoc.map.removeKeys

WITH {p1: 1, p2: 2, p3: 3, p4: 4} as node
CALL apoc.map.removeKeys( node, ['p2', 'p4'] ) YIELD value
RETURN value

答案 1 :(得分:1)

我从未见过将文档列入白名单或黑名单的方法。

但是,您可以通过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
如果没有朋友,

collect会返回一个空列表,extract会保持这种状态。