备注:本文APOC是基于Neo4j3.5版本进行安装,原因在于本地电脑的Java版本为1.8
APOC的名字最早来自于2009年,英文为 “A Package Of Components”,表示Neo4j的组件库,后来变为“Awesome Procedures On Cypher”,超级棒的Cypher过程。在《黑客帝国》电影中,APOC是Neo的队友,也是飞船的驾驶员,最后被叛徒Cypher杀害。
在APOC发布之前,开发人员需要为Cypher或Neo4j数据库尚未实现的常用功能编写过程和函数。每个开发人员都可能编写所需的函数,这会导致大量的重复。针对这种需求,Neo4j官方开发了一个过程和函数的标准库,即APOC库,在Neo4j3.3版本时,APOC成为了Neo4j的标准库。APOC库是用Java实现的,由450+个过程和函数组成(还在不断更新中),用于完成数据集成、图形算法或数据转换等领域的不同任务。与电影《黑客帝国》中情节不同的是,在Neo4j中,APOC提供的过程极大的增强了Cypher的表达能力。
APOC依赖于Neo4j的内部api,在Neo4j时,需要使用匹配的APOC版本,确保Neo4j和APOC之间的前两个版本号匹配。具体对应关系见表1-1:
表1-1 Neo4j与APOC版本对应
在Neo4j的APOC手册中有APOC的下载地址,通过链接下载指定的APOC版本,本书选用apoc-3.5.0.11-all.jar。
下载APOC的jar文件后,将jar文件复制到Neo4j的plugins目录下。在Windows系统下,plugins路径为D:\neo4j-community-3.5.5\plugins,在Ubuntu系统下,plugins路径为于/var/lib/neo4j/plugins。
在neo4j.conf 配置文件中添加:
dbms.security.procedures.unrestricted=apoc.*
该行配置语句可以完成APOC的函数和过程授权,不配置改行语句,在执行函数和过程时,可能会出现如下错误:apoc.algo.pagerank is not available due to having restricted sccess rights,check configuration。
return apoc.version()
如果出现对应的版本号,证明安装成功。
返回值为:
│"apoc.version()" │
│"3.5.0.11" │
APOC提供了数据集成,数据导出,数据结构,高级图查询等诸多功能,本小节选取部分过程和函数进行演示。相比于过程,函数更容易理解,函数可以直接应用在Cypher查询中,对传入函数中的数据进行计算并返回计算后的结果,这点与Cypher内置的函数没有明显区别。过程的调用必须使用CALL命令,APOC中的过程可以类比与关系数据库中的存储过程。
APOC提供的过程与函数数量较多,在使用过程中若有需要基于APOC实现的,可以在官网手册中获得更详细的使用说明,读者在查看过程中,可以将APOC3.5版本的官网手册和APOC 4.1版本的官网手册对比阅读。APOC 4.1版的包结构如表1-2所示。
Procedures & Functions
apoc
apoc.agg
apoc.algo
apoc.any
apoc.atomic
apoc.bitwise
apoc.bolt
apoc.cluster
apoc.coll
apoc.config
apoc.convert
apoc.couchbase
apoc.create
apoc.custom
apoc.cypher
apoc.data
apoc.date
apoc.diff
apoc.do
apoc.es
apoc.example
apoc.export
apoc.generate
apoc.gephi
apoc.get
apoc.graph
apoc.hashing
apoc.import
apoc.json
apoc.label
apoc.load
apoc.lock
apoc.log
apoc.map
apoc.math
apoc.merge
apoc.meta
apoc.metrics
apoc.model
apoc.mongo
apoc.mongodb
apoc.monitor
apoc.neighbors
apoc.nlp
apoc.node
apoc.nodes
apoc.number
apoc.path
apoc.periodic
apoc.redis
apoc.refactor
apoc.rel
apoc.schema
apoc.scoring
apoc.search
apoc.spatial
apoc.static
apoc.stats
apoc.systemdb
apoc.temporal
apoc.text
apoc.trigger
apoc.ttl
apoc.util
apoc.uuid
apoc.warmup
apoc.xml
APOC库支持将各种数据格式(包括JSON、XML和XLS)导入到Neo4j数据库中,也可以从关系型数据库、Mongodb、ElasticSearch将数据导入Neo4j数据库中。这些过程大多位于apoc.load下,也有部分位于apoc.import、apoc.mongodb、apoc.es下。
Neo4j可以通过备份和转储命令导出整个数据库。但不支持导出子图或将数据导出为标准数据格式。APOC扩展了Neo4j的导出功能,Neo4j支持将数据导出为JSON、CSV、GraphML和Cypher脚本等格式。
APOC支持导出的过程大多位于apoc.export下。在将数据导出到文件系统时,可能存在权限问题,这时可以通过在neo4j.conf中设置以下属性来启用:
apoc.export.file.enabled=true
如果没有设置这个属性,在执行导出时,将得到以下错误消息:
Failed to invoke procedure apoc.export.csv.all: Caused by: java.lang.RuntimeException: Export to files not enabled, please set apoc.export.file.enabled=true in your neo4j.conf
APOC库提供了用于操作数据结构的函数和过程,对数据结构的操作主要分为三种,分别是转换功能(Conversion Functions),映射功能(Map Functions),集合功能(Collection Functions)。转换功能用于将值的类型强制转换,转换功能主要位于apoc.convert包下。映射功能用于对map类型进行操作,映射功能位于apoc.map包下。集合功能用于对集合和列表进行操中,主要位于apoc.coll包下。
APOC库提供了了对时间类型、时间戳和日期字符串值格式化的支持,这些函数主要位于apoc.temporal和apoc.date包下。
APOC提供了关于数学运算的函数和过程,具体包括数学运算功能(包括四舍五入、最大最小值等),精确计算功能,数字格式转换功能,位运算功能。其中数学运算函数主要位于apoc.math包下,精确计算函数位于apoc.number.exact包下,数字格式转换函数位于apoc.number包下,位运算操作位于apoc.bitwise包下。
APOC库提供的高级图查询包含:扩展路径、扩展子图、邻居功能、路径操作、关系查询、节点查询、并行节点搜索等。相关的函数或过程主要位于:apoc.path、apoc.neighbors、apoc.rel、apoc.nodes、apoc.search等包中。
APOC提供了类似关系数据库中的触发器功能,触发器功能可以在创建、更新或删除Neo4j中的数据时触发。相关的函数或过程主要位于apoc.trigger中,需要注意的是,如果启用apoc.trigger,需要在$NEO4J_HOME/config/neo4j.conf中启用
apoc.trigger.enabled=true
从3.5版开始,Neo4j提供了内置的、不区分大小写的、可配置的全文索引。原有的手工检索和全文检索(位于apoc.index)将逐渐被废弃。在表13-2中已经废弃apoc.index。全文索引的相关函数或过程位于apoc.schema包下。
在算法方面,APOC库中提供了路径查找算法,相似性算法、社区检测算法、中心性算法等。在图算法方面,Neo4j有提供专用的图算法库Graph Algorithms Library,目前APOC库中除了路径查找算法外,其余算法将被弃用,即将被删除。如果要使用相关图算法,可使用图形算法库中的算法。路径查找算法主要位于apoc.algo包下。
查看apoc支持过程和函数:
call apoc.help('apoc')
返回值为apoc支持的过程,函数等,由于返回值较长,此处列出一条返回结果,为便于分析返回结果,将返回结果进行人工分行。
"procedure"
"apoc.algo.aStar"
"apoc.algo.aStar(startNode, endNode, 'KNOWS|', 'distance','lat','lon') YIELD path, weight - run A* with relationship property name as cost function"
"apoc.algo.aStar(startNode :: NODE?, endNode :: NODE?, relationshipTypesAndDirections :: STRING?, weightPropertyName :: STRING?, latPropertyName :: STRING?, lonPropertyName :: STRING?) :: (path :: PATH?, weight :: FLOAT?)"
null
null
第1行的procedure表示类型为过程;
第2行的apoc.algo.aStar表示过程的名称;
第3行表示该过程的一个应用案例;
第4行为过程的签名信息,签名的一般形式是 name : : TYPE。在调用过程或函数时,通过签名可以获得对应参数的名称、类型及位置,同时还可获悉返回值列的名称和类型。
查看APOC支持的过程和函数数量:
CALL dbms.functions() YIELD name WHERE name STARTS WITH 'apoc.' RETURN COUNT(name)
UNION
CALL dbms.procedures() YIELD name WHERE name STARTS WITH 'apoc.' RETURN COUNT(name)
返回值为:
│"COUNT(name)"│
│246 │
│294 │
表示目前3.5.0.11版本的APOC包含了246个函数和294个过程,这个数量已经超过了APOC开发之初定下目标(365个过程或函数)。
本部分操作先删除图中的所有节点和关系,代码如下:
MATCH (n) DETACH DELETE n
基于APOC生成随机图,代码如下:
CALL apoc.generate.ba(10,2,'Person','朋友')
查看所有路径,代码如下:
MATCH p = (n)-[r]-(m) RETURN p
返回结果如图2-1所示:
CALL apoc.generate.ba(10,2,‘Person’,‘朋友’)中的ba表示Barabási–Albert模型,ba模型可以产生随机的算法无标度网络。
本部分操作先删除图中的所有节点和关系,代码如下:
MATCH (n) DETACH DELETE n
PageRank算法在Google的搜索引擎中用于计算网站的排名,PageRank的规则是:关系越多和与重要节点的关系越多,那么该节点就越重要。
首先创建1000个节点:
FOREACH (id In range(1,1000) | CREATE (n:NodeLabel{id:id}))
再创建100万个关系:
MATCH (n1:NodeLabel),(n2:NodeLabel) WITH n1,n2 LIMIT 1000000 WHERE rand()<0.1
CREATE (n1)-[:REL_TYPE]->(n2)
调用PageRank算法计算NodeLabel节点中的重要性排名,代码如下:
MATCH (n:NodeLabel) WITH collect(n) AS ns
CALL apoc.algo.pageRank(ns) YIELD node,score
RETURN node,score
ORDER BY score DESC LIMIT 10
这行代码建议添加LIMIT 10,否则会出现返回值计算时间过长的情况。返回结果如图1-2,从图中可以看出id为185的节点关系很多,将上面代码中的LIMIT 10 修改为LIMIT 1 ,返回值为 id为185的节点。
图1-2 APOC pageRank算法返回结果
选择展示为Text,可以查看到pageRank算法计算得分的返回结果:
│"node" │"score"│
│{“id”:185}│1.18105│
│{“id”:345}│1.17249│
│{“id”:534}│1.16887│
│{“id”:239}│1.16823│
│{“id”:71} │1.14628│
│{“id”:484}│1.14145│
│{“id”:444}│1.13305│
│{“id”:661}│1.13231│
│{“id”:131}│1.13008│
│{“id”:314}│1.12901│
APOC的函数使用与Cypher的内置函数使用基本一致,下面基于APOC完成一个均值计算,代码如下:
RETURN apoc.coll.avg([1,2,3,4,5]) AS output
apoc.coll.avg()为APOC提供的函数,在使用过程中,只需要将参数放如函数中,即可返回对应的返回值,返回值为:
│"output"│
│3.0 │
基于APOC完成数据类型转换为字符串的操作,代码如下:
RETURN apoc.convert.toStringList([1, "2", 3, "Four"]) AS output
返回值为:
│"output" │
│[“1”,“2”,“3”,“Four”]│
返回值中,1也用双引号包裹起来,表明其数据类型的字符串。
以上讲述了APOC的安装与基本使用,相关操作,可以查询官网。