译者言:本文介绍了在Neo4j中操作字典类型数据的三个APOC函数apoc.map.clean, apoc.map.values, apoc.map.fromLists。
我们有这样一个场景,需要创建一个节点,但节点的属性要从一个字典对象中获取,这个如何实现呢?我们假设APOC库已安装。
首先,我们创建一个包含有我Twitter信息的字典对象。
:param document => {
id: 14707949, name: "Mark Needham",
username: "markhneedham", bio: "Developer Relations @neo4j",
location: "London, United Kingdom", url: "http://www.markhneedham.com",
join_date: "8 May 2008", join_time: "5:58 PM",
tweets: 24710, following: 2479, followers: 5054, likes: 1014
}
译者言:我们可以通过 :params 这个命令看到上面创建字典对象
我们要基于上面这些数据创建一个User节点,但是只想使用其中部分键值。此时,我们可以使用apoc.map.clean 函数删除一些键,下面代表显示了我将删除join_date 和 join_time 键。
WITH ["join_date", "join_time"] AS keysToRemove
RETURN apoc.map.clean($document, keysToRemove, []) AS result
删除键是一种方法,还有另一种方法是指定需要使用的键。 通过apoc.help('apoc.map') 能找到所有字典相关的方法,但是很不幸,并没有发现取指定键值的方法。
但是我们可以将两个APOC函数组合起来使用完成这个效果。首先使用apoc.map.values函数,将字典对象中一组指定键的值提取到一个数组中。
WITH ["name", "username", "bio", "following", "followers"] AS keysToKeep
RETURN apoc.map.values($document, keysToKeep)
然后,再使用apoc.map.fromLists 函数重构出一个新的字典对象。
WITH ["name", "username", "bio", "following", "followers"] AS keysToKeep
RETURN apoc.map.fromLists(keysToKeep, apoc.map.values($document, keysToKeep)) AS result
好,最后,我们再来看看文章开始的需求:创建一个结点,使用一个字典中指定键的值作为该结点的属性。代码如下:
WITH ["name", "username", "bio", "following", "followers"] AS keysToKeep
MERGE (u:User {id: $document.id })
SET u += apoc.map.fromLists($keysToKeep, apoc.map.values($document, $keysToKeep))
OK,一切顺利,希望这些能帮助到你。
原文链接:https://markhneedham.com/blog/2019/05/12/neo4j-keep-filter-keys-map-apoc/ 译者言: 如果我的描述有不准确或不清楚的地方,欢迎在文章下进行交流。