APOC是Neo4j 3.3版本推出时正式推荐的一个Java用户扩展过程包,里面包含丰富的函数和过程,作为对Cypher所不能提供的复杂图算法和数据操作功能的补充,APOC还具有使用灵活、高性能等优势。
APOC的安装:
- 在 https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases 下载对应的apoc jar 包放到Neo4j的plugin目录下;
- 修改配置文件,conf目录下的neo4j.conf,添加:
dbms.security.procedures.unrestricted=apoc.*
启动neo4j,运行如下cypher,判断类型
return apoc.meta.type('hello')
返回STRING
,注意返回值都是大写。
return apoc.meta.type(["hello", "world"])
返回LIST
create(n:Fruit{name:'apple', color:['red', 'green']})
match(n:Fruit) return apoc.meta.type(n.color)
返回STRING[]
return apoc.meta.type(1)
返回INTEGER
Tip:
如果出现上面的错误,是因为安装的时候没有修改配置文件
应用:
对Neo4j中的数据进行修改,将字符串数组压平为字符串,但是该属性中既有字符串,又有字符串数组,需要判断该属性是哪种数据类型,进行相应的操作。Cypher自带的size
函数,对于字符串返回的是字符串的长度,对于集合类型返回的是其中的元素个数。例如:
在前边create(n:Fruit{name:'apple', color:['red', 'green']})
的基础上create(:Fruit{name:'banana', color:'yellow'})
查询match(n:Fruit) return n.name, size(n.color)
可以看到,苹果的颜色是一个字符串数组,长度是2,香蕉的颜色是一个字符串,长度是6,并不能通过
size
函数有效的区分。
使用apoc中的函数:apoc.meta.type()
查询match(n:Fruit) return n.name, apoc.meta.type(n.color)
查找所有color属性为字符串数组类型的节点:
match(n:Fruit) where apoc.meta.type(n.color) = 'STRING[]' return n.name, n.color
此外apoc.meta.typeName()
函数和apoc.meta.type()
相同
压平:
对数据类型为字符串数组的属性值进行压平,中间用逗号隔开,逗号后边跟一个空格,末尾不带有括号。
create(n:Fruit{name:'grape', color:['purple', 'green', 'white']})
match(n:Fruit) where apoc.meta.type(n.color) = 'STRING[]' return substring(reduce(s='', x IN n.color | s + ', ' + x), 2)
这里使用到了Cypher自带的reduce
函数。
若将color属性为字符串数组的,设置为字符串数组中的第一个元素:
match(n:Fruit) where apoc.meta.type(n.color) = 'STRING[]' set n.color = n.color[0]
连接:
APOC 用户手册 3.4.0.1 链接中包含可以查询APOC的过程和函数,如下
参考:
http://neo4j.com.cn/topic/5ae72f3951bad0a10b198cca
https://blog.csdn.net/HaiYang_Gao/article/details/81320889
http://neo4j.com.cn/topic/5b5996abd40e09d75e4d235f