1. 定义

Web API/RESTful API是访问和集成外部数据源又一种常用的接口。目前,很多网站和应用服务都提供类似开放接口供其他应用读取其数据,而这些接口都使用JSON[1]作为数据格式。

APOC提供导入JSON格式数据的相关过程,支持从URL读取数据内容并转换成MAP结构的表示以方便在Cypher查询中使用。Cypher可以很方便地将嵌套的文档结构转换成属性图结构。

APOC同时还支持JSON Path[1],即以特定模式搜索JSON文档中的数据项并返回其内容,其概念类似应用于XML的XPath和应用于HTML的jQuery。JSON Path的语法规则如下:

操作符

描述

$

JSON文档的根节点,这也是任何JSON Path的起始操作符。

@

当前节点。

*

通配符。

..

搜索任意深度的子结构/子节点。

.<name>

直接孩子节点,以小数点(.)符号引用

['<name>' (, '<name>')]

直接孩子节点,以方括号([])引用

[<number> (, <number>)]

数组内的元素

[start:end]

数组内指定范围的元素

[?(<expression>)]

过滤条件表达式。表达式的结果必须是布尔值。

例如,对于以下的JSON文档和JSON Path例子:

J
S
O
N

{

"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(
   url,

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数据相关推荐

  1. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.8 - 图生成 完全图

    1.概述 apoc.generate.complete 本过程生成一个完全图.完全图中,每个节点有到所有其他节点的边.在无向图中,有N个节点的完全图有N x (N – 1) / 2个边.Neo4j在存 ...

  2. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.5 - 图生成 / 随机图

    1.概述 图生成过程用来生成不同类型的随机图,以用作算法研究.性能测试等目的.APOC提供下列随机图生成过程. 过程 说明 apoc.generate.er(noNodes, noEdges, 'la ...

  3. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.6 - 图生成 小世界模型

    1.概述 WS小世界模型(Watts - Strogatz model)是一种随机图生成模型,其生成的图具有小世界属性,包括较短的平均节点间距离和高集聚系数.该模型由Duncan J. Watts(邓 ...

  4. Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(5.4) - 导出数据到Cypher脚本文件

    APOC提供一系列过程实现将数据库中的数据导出到可执行的Cypher脚本文件.这些过程支持不同的导出逻辑: 导出所有数据 导出查询结果 导出特定标签节点和关系类型 导出一个graph对象 仅导出索引和 ...

  5. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.7 - 图生成 无标度网络

    1.概述 Barabási和Albert(1999)的"富者更富"(Rich get richer)生成模型(BA模型)最被熟知的无标度网络子集的生成模型.它让每个网页根据一个非均 ...

  6. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC (8.4) - 集合相关操作

    1.概述 在Cypher查询语言中,集合的使用非常普遍.集合的元素可以是简单类型的值.节点.关系.路径,甚至混合类型.下面的例子是产生集合的一些常用方法: // 返回一个包含从1到10 的整数集合 R ...

  7. 聊聊Neo4j图数据库的那些明显优势

    摘要: Neo4j是一个NoSQL的图数据库管理系统,像其他NoSQL数据库一样具有高效的查询性能.同时,Neo4j还具有完全事务管理特性,完全支持ACID事务管理.Neo4j与其他数据库相比,具有哪 ...

  8. neo4j︱图数据库基本概念、操作罗列与整理(一)

    图数据库常规的有:neo4j(支持超多语言).JanusGraph/Titan(分布式).Orientdb,google也开源了图数据库Cayley(Go语言构成).PostgreSQL存储RDF格式 ...

  9. Neo4j图数据库从入门到精通

    add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...

最新文章

  1. Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(二)
  2. Android AdapterView 源码分析以及其相关回收机制的分析
  3. 第十七届全国大学生智能汽车竞赛,我们来了
  4. 序列密码体制——密码学笔记(三)
  5. caffe安装_Ubuntu 16.04 下 Theano 安装,及配置多 GPU使用(Multiple GPUs)
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1071:菲波那契数
  7. [css] 用css创建一个三角形,并简述原理
  8. 【数据结构与算法】【算法思想】Dijkstra算法
  9. javascript核心_只需几分钟即可学习这些核心JavaScript概念
  10. python反距离权重法_反距离权重法 (Spatial Analyst)—ArcMap | 文档
  11. C语言学习 数独游戏
  12. 副本引发的问题corrupt data exception
  13. 【weiphp微信开发教程】留言板插件开发详解
  14. EGit/User Guide
  15. Google Exoplayer之全面认识
  16. 一场云计算基础设施的饕餮盛宴 --- OpenStack柏林峰会见闻及感想
  17. 2022-Java学习路线梳理
  18. 关于Java工具eclipse的基本
  19. 博客地址迁移到http://blog.csdn.net/sunansheng
  20. 大雄宝殿的“大雄”是什么意思

热门文章

  1. 联想电脑管家 锁屏壁纸目录
  2. 微信自定义链接分享标题描述跳转任意链接url在线生成方法
  3. 获取客户端IP地址定位城市信息
  4. NOIP2016普及组复赛广东省一等奖名单及排名
  5. 序言 互联网金融第二弹
  6. Python大富翁大富豪游戏源代码
  7. 电视android系统怎么重启,电视一直出现android怎么办
  8. 网易游戏面试--两次股票买入卖出的最大收益
  9. 智慧树/知到——程序设计基础(C语言)入门篇(第一章到第五章测试)
  10. calcite简单入门