在Neo4j中怎样使用APOC函数来过滤字典中的Key

译者言:本文介绍了在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/ 译者言: 如果我的描述有不准确或不清楚的地方,欢迎在文章下进行交流。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,451评论 0 9
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,291评论 0 16
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,664评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,943评论 0 8