Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(5.5) - 导入JSON数据
1. 定义
Web API/RESTful API是访问和集成外部数据源又一种常用的接口。目前,很多网站和应用服务都提供类似开放接口供其他应用读取其数据,而这些接口都使用JSON[1]作为数据格式。
APOC提供导入JSON格式数据的相关过程,支持从URL读取数据内容并转换成MAP结构的表示以方便在Cypher查询中使用。Cypher可以很方便地将嵌套的文档结构转换成属性图结构。
操作符 |
描述 |
$ |
JSON文档的根节点,这也是任何JSON Path的起始操作符。 |
@ |
当前节点。 |
* |
通配符。 |
.. |
搜索任意深度的子结构/子节点。 |
.<name> |
直接孩子节点,以小数点(.)符号引用 |
['<name>' (, '<name>')] |
直接孩子节点,以方括号([])引用 |
[<number> (, <number>)] |
数组内的元素 |
[start:end] |
数组内指定范围的元素 |
[?(<expression>)] |
过滤条件表达式。表达式的结果必须是布尔值。 |
例如,对于以下的JSON文档和JSON Path例子:
J |
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 } "bicycle": { "color": "red", "price": 19.95 } }, "expensive": 10 } |
JSON Path |
结果 |
$.store.book[*].author |
所有book的author节点 |
$..author |
所有author节点 |
$.store.* |
store中的所有节点/数据项 |
$.store..price |
store中的所有节点的price |
$..book[2] |
第3个book节点 |
$..book[-2] |
倒数第2个book节点 |
$..book[0,1] |
第1和第2个book节点 |
$..book[:2] |
从索引为0(含)的book节点,到2(不含)的book节点。 |
$..book[1:2] |
从索引为1(含)的book节点,到2(不含)的book节点。 |
$..book[-2:] |
最后2个book节点 |
$..book[2:] |
倒数第2个book节点 |
$..book[?(@.isbn)] |
所有有isbn属性的book节点 |
$.store.book[?(@.price < 10)] |
Store下的所有book节点、而且book的price < 10 |
$..book[?(@.price <= $['expensive'])] |
所有price属性比‘expensive’的值低的book节点 |
$..book[?(@.author =~ /.*REES/i)] |
All books matching regex (ignore case) |
$..* |
返回所有内容 |
$..book.length() |
book节点的数量,不管book是在文档中的哪个层次出现。 |
更多说明请参见JSON Java Implementation by Jayway(https://github.com/json-path/JsonPath)。
2. 应用
读取JSON数据(来自文件或URL),用于数据迁移、集成和转换等目的。
过程调用接口 – apoc.load.json
过程接口 |
CALL apoc.load.json( path {configuration} ) |
参数名 |
类型 |
缺省值 |
可为空? |
说明 |
url |
字符串 |
无 |
否 |
JSON数据源的本地文件路径,或者URL。 |
path |
字符串 |
NULL |
是 |
JSON Path用来提取JSON文档中的内容。参见5.6.1中的说明。 |
{configuration} |
MAP |
有 |
是 |
导出配置选项。参见下面各行。 |
failOnError |
布尔值 |
true |
是 |
在导入过程中如果出错是否停止执行 |
示例
// (1) 通过stackoverflow API读取最近的关于neo4j的问题和回答。
// 参数:- url: stackoverflow API及调用参数
// 返回:问题和回答标题、所有者、创建日期及所有数据项名称WITH "https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf" AS url
CALL apoc.load.json(url)
YIELD value
UNWIND value.items AS item
RETURN item.title, item.owner, item.creation_date, keys(item)
查看返回的JSON数据内容,可以得到以下的结构(为节省空间,部分内容省略):
{"quota_remaining": 282,"has_more": true,"items": [{"owner": {"link": "https://stackoverflow.com/users/11532153/sirui-li","reputation": 1,"profile_image": "......","user_type": "registered","display_name": "Sirui Li","accept_rate":76,"user_id": 11532153},"comment_count": 0,"last_editor": {......},"answers": [{......},{......},],"link": "......","last_activity_date": 1559279740,"creation_date": 1559277139,"answer_count": 1,"title": "......","question_id": 56388698,"tags": ["neo4j","cypher"],
},
{......
}]
}
上述结构中,实际数据内容包含在items数组内,每一项(发布的问题)又包含基本属性如title、link、tags(标签的数组),和嵌套数据项目如owner、answers等。如果我们想按照每个问题的owner的accept_rate进行筛选,仅返回accept_rate>50的那些问题,那么JSON Path可以这样写:$.items[?(@.owner.accept_rate>50)]。完整的例子如下。
// (2) 通过stackoverflow API读取最近的关于neo4j的问题和回答,应用
// JSON Path筛选出accept_rate>50的那些项目。
// 参数:- url: stackoverflow API及调用参数
// 返回:问题和回答标题、所有者、创建日期及所有数据项名称。注意因为使用
// JSON Path返回items中的每一项,value的内容不再包括items数组。WITH "https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf" AS url
CALL apoc.load.json(url,'$.items[?(@.owner.accept_rate>50)]'
)
YIELD
RETURN value.title, value.owner, value.creation_date, keys(value)
在提取了JSON中的数据项和值之后,创建对应的节点和关系就是相对容易的事情,这里就不再详述。
|
可以在neo4j.conf中为RESTful API的URL定义别名,方法如下: apoc.json.stackoverflow.url=https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf 那么,上面的例子中对过程的调用会变成: CALL apoc.load.json('stackoverflow') |
[1] https://code.google.com/archive/p/json-path/
Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(5.5) - 导入JSON数据相关推荐
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.8 - 图生成 完全图
1.概述 apoc.generate.complete 本过程生成一个完全图.完全图中,每个节点有到所有其他节点的边.在无向图中,有N个节点的完全图有N x (N – 1) / 2个边.Neo4j在存 ...
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.5 - 图生成 / 随机图
1.概述 图生成过程用来生成不同类型的随机图,以用作算法研究.性能测试等目的.APOC提供下列随机图生成过程. 过程 说明 apoc.generate.er(noNodes, noEdges, 'la ...
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.6 - 图生成 小世界模型
1.概述 WS小世界模型(Watts - Strogatz model)是一种随机图生成模型,其生成的图具有小世界属性,包括较短的平均节点间距离和高集聚系数.该模型由Duncan J. Watts(邓 ...
- Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(5.4) - 导出数据到Cypher脚本文件
APOC提供一系列过程实现将数据库中的数据导出到可执行的Cypher脚本文件.这些过程支持不同的导出逻辑: 导出所有数据 导出查询结果 导出特定标签节点和关系类型 导出一个graph对象 仅导出索引和 ...
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.7 - 图生成 无标度网络
1.概述 Barabási和Albert(1999)的"富者更富"(Rich get richer)生成模型(BA模型)最被熟知的无标度网络子集的生成模型.它让每个网页根据一个非均 ...
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC (8.4) - 集合相关操作
1.概述 在Cypher查询语言中,集合的使用非常普遍.集合的元素可以是简单类型的值.节点.关系.路径,甚至混合类型.下面的例子是产生集合的一些常用方法: // 返回一个包含从1到10 的整数集合 R ...
- 聊聊Neo4j图数据库的那些明显优势
摘要: Neo4j是一个NoSQL的图数据库管理系统,像其他NoSQL数据库一样具有高效的查询性能.同时,Neo4j还具有完全事务管理特性,完全支持ACID事务管理.Neo4j与其他数据库相比,具有哪 ...
- neo4j︱图数据库基本概念、操作罗列与整理(一)
图数据库常规的有:neo4j(支持超多语言).JanusGraph/Titan(分布式).Orientdb,google也开源了图数据库Cayley(Go语言构成).PostgreSQL存储RDF格式 ...
- Neo4j图数据库从入门到精通
add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...
最新文章
- Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(二)
- Android AdapterView 源码分析以及其相关回收机制的分析
- 第十七届全国大学生智能汽车竞赛,我们来了
- 序列密码体制——密码学笔记(三)
- caffe安装_Ubuntu 16.04 下 Theano 安装,及配置多 GPU使用(Multiple GPUs)
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1071:菲波那契数
- [css] 用css创建一个三角形,并简述原理
- 【数据结构与算法】【算法思想】Dijkstra算法
- javascript核心_只需几分钟即可学习这些核心JavaScript概念
- python反距离权重法_反距离权重法 (Spatial Analyst)—ArcMap | 文档
- C语言学习 数独游戏
- 副本引发的问题corrupt data exception
- 【weiphp微信开发教程】留言板插件开发详解
- EGit/User Guide
- Google Exoplayer之全面认识
- 一场云计算基础设施的饕餮盛宴 --- OpenStack柏林峰会见闻及感想
- 2022-Java学习路线梳理
- 关于Java工具eclipse的基本
- 博客地址迁移到http://blog.csdn.net/sunansheng
- 大雄宝殿的“大雄”是什么意思