数据导入从API接口中导入

举报
xcc-2022 发表于 2022/08/07 21:17:12 2022/08/07
【摘要】 1. 定义        Web API/RESTful API是访问和集成外部数据源又一种常用的接口。目前,很多网站和应用服务都提供类似开放接口供其他应用读取其数据,而这些接口都使用JSON[1]作为数据格式。        APOC提供导入JSON格式数据的相关过程,支持从URL读取数据内容并转换成MAP结构的表示以方便在Cypher查询中使用。Cypher可以很方便地将嵌套的文档结构转...

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')

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。