neo4j的基本概念:
节点,属性,关系,标签
节点:可以创建一个为空的节点,只有默认内置的id属性。
关系:关系是有方向的,两个节点可存在多个关系,关系上可以数据属性。一个节点存在指向自己的关系。
属性:节点和关系都可以具有多个属性。属性值可以是基本的数据类型。
标签:节点上可以设置标签。一个节点可以具有多个标签。
属性值的范围:
boolean 布尔
byte
short
int
long
float
double
char
string
neo4j安装教程
windo,ubuntu
https://blog.csdn.net/sa726663676/article/details/114641013
ubuntu安装neo4j非常简单,下载neo4j社区版直接解压即可,然后修改conf、neo4j-server.properties 将org.neo4j.server.webserver.address=0.0.0.0注释符去掉。启动即可。
neo4j启动的方式:
neo4 shell终端环境,neo4j web端
neo4 shell端启动:
window 启动命令:
linux启动命令:
进入neo4j的bin目录下:输入 ./neo4j-shell 启动shell端
neo4j web端启动:
进入neo4j安装的bin目录文件夹下
window 启动命令:
linux启动命令:
./neo4j start
创建常用的数据库
create movies
cypher存在的类型:
int:
float类型:
列表类型:
Cypher支持列表操作,并且和Python中的列表很相似。使用[],可以直接手动创建列表,例如:RETURN [1,2,3]。Cypher内置的range函数可以直接返回一个列表,用法和Python中的range也几乎一样。需要注意的是Cypher中的列表和Python一样,可以包含不同类型的元素,如 RETURN [[1, 2], 3, 1, 5.2, "sss"] 。
1、range
定义:range(start, end, step)
其中step可以省略,默认值是1,需要注意:
* 返回结果包含start和end。
* start、end、step必须是Integer 类型。
* 如果start==end,则只返回一个元素的列表。
* 如果start > end,则返回一个负数。
* 如果start > end,且step < 0,则返回一个递减的列表。
2、列表索引
下标索引:RETURN [1,2,3,4][1] //返回2
倒序索引:RETURN [1,2,3,4][-1] //返回4
范围索引:RETURN [1,2,3,4][1..3] //返回[2,3],注意返回的是列表,不包括4
范围索引:RETURN [1,2,3,4][-2..] //返回[3,4]
越界索引:RETURN [1,2,3,4][2..9] //只返回[3,4]
越界索引:RETURN [1,2,3,4][7..9] //返回一个空列表 []
越界索引:RETURN [1,2,3,4][9] //单个元素越界索引,返回 null
3、列表推导
列表推导是Cypher基于已有列表创建新的列表,可以和where等语句一起使用。功能类似于Python的map操作,也类似于lambda表达式,形式看起来和linux管道符号 | 一样,作用也类似,前面的输出作为后面的输入。
RETURN [x in range(1,3) | x^2] //输出[1.0, 4.0, 9.0],注意这么写是错误的:RETURN [x^2 in range(1,3)]
RETURN [x in range(1,5) where x%2=0 | x^2] //返回[4.0, 16.0]
4、列表函数
reverse:列表反转
reverse([1,2,3,4])
tail:跳过列表的第一个元素,在路径遍历的时候会用到
tail([1,2,3,4])
参考:https://blog.csdn.net/haveanybody/article/details/88861708
cypher关键字学习
查:match,merge
增:create,merge
删:delete,drop
改:set
条件:where,case关键字 ,逻辑符号(<>=),正则表达式,关系匹配等
where:
case:
Cypher支持case条件表达式,它的逻辑类似于C语言中的if/else语句。一个CASE语句包含一个或多个WHEN-THEN子句,每个子句都是一个表达式。 case语句也可以包含一个ELSE子句,当之前的条件都不为真时,则执行该ELSE子语句,类似于C语言中的default。
CASE语句有两种语法:其中的一种语法等效于if-else语句,而另一种则类似于SWITCH语句。对于等效于IF-ELSE语句来说,系统会计算每个WHEN子句中的布尔条件,并执行条件为真的第一个语句块,即使有多个满足条件的WHEN子句,也只会执行第一个。仅当所有WHEN子句条件均为假时,才会执行末尾的ELSE子句(如果有)。如果所有WHEN子句的布尔条件都为假,且没有ELSE语句,则返回null。Cypher的case语法和gsql的case语法用法一样。end后面也可以接as语句。
(1)第一种写法
类似于C语言的if/else
return
case
when 1=2 then 1
when 2=2 then 2
when 3=3 then 3
else 4
end
上面的语句输出 2,并不会输出3。我们在做区间判断或者需要比较不同的字段的时候,常用这种写法。
(2)第二种写法
类似于C语言的switch
return
case 3
when 2 then 2
when 3 then 3
when 4 then 4
else 0
end
上面的语句输出 3,在使用的时候,我们常常通过match找到某个节点,对某个属性字段做不同处理。
参考:https://blog.csdn.net/haveanybody/article/details/88835941
逻辑符号:
正则表达式:
关系匹配相关操作
查询结果过滤:skip ... limit ... order by ....
其他:union,unwind,foreach
union:(联合多个return输出结果关键字)
UNION可以组合两个或者两个以上的查询结果到一个结果中,需要注意一下几点:
(1)可以组合两个或者两个以上的查询结果。
(2)UNION和UNION ALL的用户不同,尤其需要注意UNION的用法。
(3)每个查询的结果列数和列名都必须相同。
1、可以组合两个或者两个以上的查询结果
unwind [1,2,3] as x
return x
union all
unwind [4,5,6] as x
return x
union all
unwind [7,8,9] as x
return x
上面结果输出1~9。
2、UNION和UNION ALL
UNION ALL会输出所有的查询结果,不做任何处理;UNION输出的时候会做去重处理,不仅仅是对不同查询结果之间做去重处理,而且还会对同一个查询的结果做去重处理。看下面两个查询。
unwind [1,2,1,2,3] as x
return x
union all
unwind [1,2,1,2,3] as x
return x
上面语句会输出:1,2,1,2,3,1,2,1,2,3。(实际上是换行输出。)
unwind [1,2,1,2,3] as x
return x
union
unwind [1,2,1,2,3] as x
return x
上面语句会输出:1,2,3,(实际上是换行输出。)而不是1,2,1,2,3。
3、每个查询的结果列数和列名都必须相同
下面查询是错误的,因为列名x、y不同。
unwind [1,2,3] as x
return x
union
unwind [4,5,6] as y
return y
参考:https://blog.csdn.net/haveanybody/article/details/89643606
unwind/foreach:遍历关键字
unwind:官方文档对于UNWIND的说明:With UNWIND
, you can transform any list back into individual rows. 注意两点,list和individual rows,说明输入只要是列表就行,输出是每一个元素。
示例:遍历列表一行行输出:
unwind [1,2,3,null] as x return x
foreach:主要用于列表更新操作
三 cypher中的函数学习
使用函数:
函数主要包括:断言函数,标量函数,字符串函数,类型转换函数,聚合函数,遍历函数等等
断言函数/布尔函数:
常用的有:all(), any(), exist,none,sigle。返回的是bool类型的值(True/False)
all():
用于判断列表中只要有一个数据为真就返回Ture。
用法:any(variable in list where 条件)
例如:return any(x in [2,4,6,8] where x%2=0) #返回true
any():
用于判断列表中只要有一个数据为真就返回Ture。
用法:any(variable in list where 条件)
例如:return any(x in [1,2,3,4] where x%2=0) #返回true
注意:return any(x in [] where x%2=0) //返回false
return any(x in [null] where x%2=0) //返回null
return any(x in [2.0] where x%2=0) //返回true
exist():
exist用于判断实体是否存在某个属性。
示例: match (n) where exists(n.name) return n #找出所有存在name属性的节点数据
none():
列表中的每个元素都不满足返回真
用法:none(variable in list where 条件)
例如:return none(x in [1,3,5,7] where x%2=0) #返回true
single():
用于判断列表中只要有一个数据为真就返回Ture。
用法:single(variable in list where 条件)
例如:return single(x in [1,2,3,5] where x%2=0) #返回true
return single(x in [1,2,3,4] where x%2=0) #返回false
标量函数:
常用的有:coalesce,startNode/endNode,head/last,randomUUD,id,size,length,properties,timestamp,
coalesce():
语法:coalesce(expression [, expression]*)
含义:返回参数中第一个不为null的值,如果都为null,则返回null。
Demo:MATCH (a) RETURN coalesce(a.hairColor, a.eyes) //返回第一个存在的属性,只要有一个节点存在就返回,不存在的返回null
head和last
语法:head(list),last(list)
含义:返回列表的第一个/最后一个元素。
Demo:return head([3,null,1,2,3]) //返回3,return head([]) //返回null
id():
语法:id(expression)
返回:Integer
含义:返回节点或者关系的id
size
语法:size(list)
含义:返回一个列表或者字符串的长度,size(null)返回null。
返回:Integer
Demo:return size("www")
length
语法:length(path)
含义:返回路径的长度,输入是路径,length(null)返回null。
返回:Integer
Demo:match p=(n:Person{name:"p1"})-[*1..5]-(m) return length(p)
注意:length和size功能非常相似,length也可以用于计算string、list、pattern的长度,但是强烈建议只对path使用length,对其它类型长度的计算功能,后续可能被丢弃。
timestamp():
语法:timestamp()
含义:返回当前时间和1970年1月1日之间的毫秒值。
返回:Integer
Demo:RETURN timestamp()
注意:在整个查询执行期间,timestamp的值都是相同的,即不能使用timestamp计算一个查询的执行时间
字符串函数:
left()/right(),Itrm,rtrim,trim,replace(),reverse(),split(),substring(),contains()
ltrim、rtrim、trim
语法:lTrim(original)、rTrim(original)、trim(original)
含义:去除original左边、右边、两边空格
返回:String
3、replace
语法:replace(original, search, replace)
含义:使用replace替换original中的所有search字符串
返回:String
4、reverse
语法:reverse(original)
含义:翻转original
返回:String
5、split
语法:split(original, splitDelimiter)
含义:使用splitDelimiter切分original,需要注意的是当字符串首尾是分隔符时,首尾也会返回一个 ""
返回:列表
Demo:return split('w3w1w2w3w4w3', 'w3') //返回 ["", "w1w2", "w4", ""]
6、substring
语法:substring(original, start [, length])
含义:获取original从start开始的length长子串,从0开始,包含start
返回:String
7、toLower
语法:toLower(original)、toUpper(original)
含义:转换original为小写、大写
返回:String
8、contains
语法:original contains substring
含义:contains并不是一个函数,是一个关键词,在字符串中使用也很方便,判断original中是否包含substring
返回:Boolean
类型转换函数:
常用的有:toBoolean(),toFloat(),toInteger(),toString(),type(),labedls()
labels():返回节点的标签列表
语法:labels(node)
含义:返回节点的Label,labels(null)返回null。
返回:list,因为节点可以有多个label
Demo:match(n:Person{name:"p1"})-[r]-(m) return labels(m)
聚合函数:
Cypher的聚合和别的语言不一样,比如在SQL中聚合是通过group by实现的,而在cypher中是通过聚合函数默认聚合的。看一个例子:
match(n:Person) return n.name, count(n.name)
表面上看没有做任何聚合操作,实际上,因为使用了聚合函数count,因此会自动根据前面字段做聚合操作,上述语句的意思是统计每个名字的使用次数(使用相同名字的个数)。 参考链接:https://blog.csdn.net/haveanybody/article/details/89387268
常用的聚合函数:例如:count,sum,avg,percentileDisc,percentileCont,stdev,stdevp,max/max,collect ,distinct?
遍历函数:
常用的遍历函数,例如;keys,labels,nodes,relationships,reduce
keys
语法:keys(expression)
含义:返回节点、关系或者map的属性列表
返回:List
Demo:MATCH (a) WHERE a.name = 'Alice' RETURN keys(a)
2、labels
语法:labels(node)
含义:返回节点的所有标签列表,之所以返回是列表,是因为节点可以有多个label
返回:List
Demo:MATCH (a) WHERE a.name = 'Alice' RETURN labels(a)
3、nodes
语法:nodes(path)
含义:返回路径上的所有节点
返回:List
Demo:MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' AND c.name = 'Eskil' RETURN nodes(p)
4、relationships
语法:relationships(path)
含义:返回路径上的所有关系
返回:List
Demo:MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' AND c.name = 'Eskil' RETURN relationships(p)
5、reduce
语法:reduce(accumulator = initial, variable IN list | expression)
含义:返回每个元素作用在表达式上的结果,类似于scala中的reduce函数
返回:由输入决定
Demo:return(init = 0, x in [1,2,3,4] | init+x) as sum //求所有列表元素的和
其他函数如:
参考:https://blog.csdn.net/haveanybody/article/details/89644340
数据库管理:
社区版本好像不支持创建新的数据库提示错误:
Neo.ClientError.Statement.NotSystemDatabaseError
Unsupported administration command: create database customers
用户连接初始数据库后会存在两个数据库:neo4j和system数据库。neo4j为默认的存储数据的数据库,system为管理系统自动创建的数据库。
使用默认数据库 :use neo4j
使用系统数据库 :use system
显示系统数据库信息 show databases #需要执行:use system操作
show database system #显示某一个数据库信息
show default database #显示默认的数据库
create database customers #创建数据库
#如果数据库存在的两种创建新数据库的方式
CREATE DATABASE customers IF NOT EXISTS #创建数据库如果数据库存在
CRETAE OR REPLACE DATABASE customers #
STOP DATABASE customers #停用数据库
SHOW DATABASE customers #显示数据库
START DATABASE customers #开始数据库
SHOW DATABSE customers #显示数据库
DROP DATABASE customers if EXISTS #删除数据库
数据库索引:
角色管理:企业版支持,社区版很多功能限制,权限只能操作自己的一个角色
python连接neo4j数据库
先简单介绍一下 neo4j,Cypher,neo4j-driver之间的关系
neo4j 是一个图数据库,专门存储图结构, 图的定义;
Cypher 是Neo4J的声明式图形查询语言,类似于传统数据库的 SQL;
neo4j-driver python版本的Neo4J的驱动程序,实现python与Neo4J的交互,通过这个驱动就可以在python中使用Neo4J了,在python中使用 Cypher来操作图数据库。
py2neo python版本的Neo4J的驱动程序,不同的是,其可以直接用类似Python语法操作图数据库。建议使用 py2neo,更方便
https://blog.csdn.net/sa726663676/article/details/114671703
远程连接:bolt/http/https (需要ip地址和端口号)
bolt连接方式:
https://blog.csdn.net/sa726663676/article/details/114671703
http/https连接方式:
将bolt关键字改为http关键字就变成了http连接了。
neo4j自定义函数开发
在Neo4j中,自定义函数是需求利用Java语言去独立开发,然后生成.jar文件去部署在图数据库的安装目录plugin中,如果是集群的话,每台服务器都需要部署。再重新启动图数据库才能生效。用户自定义函数,顾名思义就是开发一些个性化方法去解决复杂的业务逻辑问题。虽然它的功能还不够强大,但是足够去扩展和提升Neo4j的一些常用命令功能。
对于自定义函数的调用,它跟常用的Cypher方法一样,只是函数名的规范会有限定,比如自定义函数join,它在Java工程中的目录结构为org.neo4j.examples,因此它在调用时的规范写法为org.neo4j.examples.join(参数)。,自定义函数的结果输出类型很多
现有的Neo4j图数据库也包含了很多自定义的函数,你可以在正式实践之前去初步了解一下,在命令框输入:CALL dbms.procedures()即可查询到,结果输出包含了函数名、用法说明和功能描述。你后期的开发也可以按照这样的规范标准来。
部署好Java和Neo4j的环境之外,你最好去安装Maven软件,并配置到IDE中,因为它可以极大简化你开发的工作量。maven是一个项目管理工具,包含项目管理,插件以及目标的逻辑等。
自定义函数开发和存储可参考:https://blog.csdn.net/yuanyk1222/article/details/94558980
、