相关文章推荐
忐忑的灯泡  ·  CLion - 知乎·  1 年前    · 
幸福的番茄  ·  java - ...·  1 年前    · 
悲伤的茄子  ·  android - Make ...·  1 年前    · 

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

}

J SON 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(
   '$.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')

 

该程序将包含像/标签信息的 json 文件导入数据库 neo4j 中。 它是用 node.js 编写的,需要包,所以使用 npm 安装包,如下所示。 关于如何使用 node-neo4j,请参考。 sudo npm install neo4j@1.x --save 如果在安装后输入以下内容,则会将数据输入到以 localhost:7474 运行的 neo4j 中。 node importData_neo4j.js 需要注意的事项 (当然)是必须在程序运行之前。 当您运行该程序时,它会擦除​​所有现有数据并将其放回原处。 删除从第 65 行开始的查询语句后,您可以通过仅执行 createImageNode(Image) 在现有数据上添加数据。 笔记和问题 还有一个因为上面的包没有批处理支持,是用coffee脚本编写的。 。 让我们一步一步地学习如何使用它。 // YIELD关键字表示每次导入json数据中的一组数据,即`[...]`中的每一个`{}` CALL apoc.load.json("file:///data.json") YIELD value as data // 创建SUB 直接在官网下载安装包安装,解压即可。 下载相应的jar包 apoc 包下载链接: https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases apoc-3.3.0.1-all.jar 将对应jar包放在安装目录plugins文件目录里,然后conf目录里的neo4j.conf的后面加上 dbms.security.procedures.unrestricted=apoc.* apoc.import.file.enabled=true Neo4j not running 出现这种情况, Neo4j没有运行, 但是浏览器仍然可以访问neo4j数据库的情况, 直接执行导入数据后,是无法看到导入数据库, 其实这种情况下Neo4j仍在运行(否则浏览器是无法然访问的), 这就需要强... 本地Neo4j数据库服务器Neo4j数据库相差的只是ip地址,如果自己有插入所有节点和关系的代码的情况下更换一下ip地址和账密即可,如若没有源码或者部分节点是手动构建的,如何转移数据就成了问题。笔者通过自带的export json功能进行数据的迁移。 节点与关系导出 分布匹配所有的关系与节点,导出json格式数据,这里限制了显示上限为300,实际导出的文件是包含全部数据的,分别导出node.json与relation.json 数据迁移 使用python的json导入json数据,同时进 一、Neo4j 1.1 简介相对传统的 Relational Database Management System,比如MySQL,PostgreSQL。Neo4j有以下特点:SQL一样容易查询语言的Neo4j CQL它遵循属性数据模型它通过使用Apache Lucence支持索引它支持UNIQUE约束它包含一个UI执行CQL指令:Neo4j的数据浏览器它支持完整的ACID(原子性,一致性,隔离... 1.将excel的数据存入neo4j 本程序使用Jupyter运行,若使用pycharm还需安装py2neo pip install py2neo==5.0b1 注意版本,要不对应不了 文档:https://py2neo.org/v4/index.html 在第一个文件中 用panda读取excel中的数据 将取出的数据中的实体去重,另外保存到变量中,最终用于创建结点:例中data_extraction() 将读取到的数据抽取需要的列,再次拼成dataframe,最终用于创建关系:例中relation_ https://github.com/neo4j-contrib/neo4j-apoc-procedures 注意neo4j软件版本要与APOC插件匹配,否则启动neo4j可能报错 apoc version neo4j version 4.0.0.16# 4.0.6 (4.0.x) ​​​​​​1.定义 CSV是最常用的数据交换格式,被各类应用广泛使用。Neo4j提供IMPORT数据导入命令行工具(neo4j-admin import,只能离线使用),以及在Cypher中提供LOAD CSV来实现从CSV文件中导入数据数据库中。 APOC的CSV导入过程则提供了更丰富的特性: 为每行增加了行号 为每行提供了MAP和LIST两种数据表示 自动的数据类型转换(包含分解列表到数组) 保持字串原始格式的选项 忽略字段的选项 没有标题的文件... 2、Cypther load csv语句,对csv格式的数据进行读取; 3、官方neo4j-import 工具, 目前被neo4j-admin import所替代; 4、batch-import 工具 以上的几种方式各有优劣,对于个人使用中小型数据进行尝试,在数据量和速度上,load和import应该都 APOCNeo4j 3.3版本推出时正式推荐的一个Java存储过程包,里面包含丰富的函数和过程,作为对Cypher所不能提供的复杂算法和数据操作功能的补充,APOC还具有使用灵活、高性能等优势。APOC包含函数和过程,是一个基于Neo4j的函数包插件。 它包括:集合操作(排序、最大值、最小值)、操作、文本搜索、转换、排序、地理空间操作、数据集成、报表、获得表示的元APOC文档:https://neo4j-contrib.github.io/neo4j-a...... 一直以来都想写一些关于Neo4j APOC工具包的使用笔记,不过一直比较忙,最近又需要用到里面的一些东西,决定开始关于APOC笔记的第一步。个人看来,掌握了apoc的使用,cypher水平至少可以提高一倍,开发效率也可以快很多(个人愚见)。下面的笔记都是以linux下的Neo4j 服务器版为准。 官网地址:https://neo4j.com/docs/labs/apoc/current/...