在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(来自可选匹配),我可以保留正确的空值处理
如果我不能这样做,那么我想要一种使用自定义对象的方法,但如果所有字段都为空,则根本不返回该对象。
非常欢迎任何其他处理可选匹配的解决方法或提示。
答案 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
会保持这种状态。