数据导入从API接口中导入
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 |
结果 |
所有book的author节点 |
|
所有author节点 |
|
store中的所有节点/数据项 |
|
store中的所有节点的price |
|
第3个book节点 |
|
倒数第2个book节点 |
|
第1和第2个book节点 |
|
从索引为0(含)的book节点,到2(不含)的book节点。 |
|
从索引为1(含)的book节点,到2(不含)的book节点。 |
|
最后2个book节点 |
|
倒数第2个book节点 |
|
所有有isbn属性的book节点 |
|
Store下的所有book节点、而且book的price < 10 |
|
所有price属性比‘expensive’的值低的book节点 |
|
All books matching regex (ignore case) |
|
返回所有内容 |
|
book节点的数量,不管book是在文档中的哪个层次出现。 |
更多说明请参见JSON Java Implementation by Jayway(https://github.com/json-path/JsonPath)。
2. 应用
读取JSON数据(来自文件或URL),用于数据迁移、集成和转换等目的。
|
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 |
- 点赞
- 收藏
- 关注作者
评论(0)