https://blog.csdn.net/u013946356/article/details/81736232
数据库服务启动:
/opt/soft/neo4j-community-3.4.5/bin/neo4j start
数据库服务停止:
./neo4j stop
查看服务状态:
./neo4j status
客户端客户端访问:
http://172.24.103.3:7474/browser/
账号:neo4j
密码:123456
org.neo4j.driver
neo4j-java-driver
1.6.1
结合spring data框架进行neo4j
spring:
data:
neo4j:
uri: http://172.24.103.3:7474
url: bolt://172.24.103.3:7687
username: neo4j
password: 123456
参考百度资料neo4j 配置
spring.data.neo4j.uri=http://localhost:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123456
spring.data.neo4j.url=bolt://localhost:7687
#neo4j因果集群url配置
spring.data.neo4j.urls=bolt+routing://localhost:7687,bolt+routing://localhost:7687,bolt+routing://localhost:7687
spring框架通过@value注解来获取到配置文件指定值
获取驱动
业务+cql构建工具类
它支持两种Java API:Cypher API和Native Java API来开发Java应用程序
有必要了解以上两种api,到时候封装工具类使用。
数据模型:
属性是键值对,可以用来存储节点的属性,比如到时候存储血缘分析的对应的数据时,可以存储表名,字段名,或者说库名
像节点一样,关系也可以包含属性作为键值对。
关系具有方向:单向,或者双向
每个关系包含:“开始节点”,“从节点”,“结束节点”
Label将一个公共名称与一组节点或关系相关联。
节点或关系可以包含一个或多个标签。
我们可以为现有节点或关系创建新标签。
我们可以从现有节点或关系中删除现有标签。
从前面的图中,我们可以观察到有两个节点。
左侧节点都有一个标签:“EMP”,而右侧节点都有一个标签:“Dept”。
这两个节点之间的关系,也有一个标签:“WORKS_FOR”
注: - Neo4j将数据存储在节点或关系的属性中。
个人理解,类似一个分类,将节点,或者关系可以来个逻辑上的分类。
导出的数据格式有两种,一种是json,一种是csv格式。
cql:声明性模式匹配语言
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4deDC2xZ-1596973558433)(data:image/png?lastmodify=1596161393;base64,)]
删除属性使用remove,删除节点和关系使用delete,也就是删除的粒度不同,使用不同的关键字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3sH01Ly-1596973558436)(data:image/png?lastmodify=1596161393;base64,)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X3fCRJnY-1596973558438)(data:image/png?lastmodify=1596161393;base64,)]
MATCH (ee: Person) DELETE ee
CREATE (:)
CREATE (ee:Person)
1、Neo4j数据库服务器使用此
作为Neo4j DBA或Developer,我们不能使用它来访问节点详细信息。
2、Neo4j数据库服务器创建一个
作为Neo4j DBA或Developer,我们应该使用此标签名称来访问节点详细信息。
解锁数据通过标签来检索,而不是节点名称来检索
Neo4j CQL“CREATE”命令用于创建带有属性的节点。 它创建一个具有一些属性(键值对)的节点来存储数据
CREATE (
:
{
:
........
:
}
)
CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUs4bGjk-1596973558443)(data:image/png?lastmodify=1596161393;base64,)]
要定义字符串类型属性值,我们需要使用单引号或双引号。
MATCH
(
:
)
match关键子不能单独使用,需要结合return或者update关键字来使用
RETURN
.,
........
.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ebk6jnJ-1596973558446)(data:image/png?lastmodify=1596161393;base64,)]
在Neo4j CQL中,我们不能单独使用MATCH或RETURN命令,因此我们应该合并这两个命令以从数据库检索数据。
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname
个人觉的,节点名称当作别名来使用了
MATCH (dept: Dept)
RETURN dept
上面的cql返回的是ui的结果
MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
MATCH (emp:Employee)
WHERE emp.name = 'Abc'
RETURN emp
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
MATCH (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
MATCH (cust:Customer),(cc:CreditCard)
WHERE cust.id = "1001" AND cc.id= "5001"
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r
MATCH (e: Employee) DELETE e
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel
SET子句向现有节点或关系添加新属性。
REMOVE子句来删除节点或关系的现有属性。
REMOVE命令用于
DELETE和REMOVE命令之间的主要区别 -
DELETE和REMOVE命令之间的相似性 -
从数据库中永久删除节点或关系的属性或属性列表
CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250})
它类似于以下两个SQL命令在一个镜头。
CREATE TABLE BOOK(
id number,
title varchar2(20),
pages number,
pages number
);
INSERT INTO BOOK VALUES (122,'Neo4j Tutorial',340,250);
MATCH (book : Book)
RETURN book
类似于
SELECT * FROM BOOK;
MATCH (book { id:122 })
REMOVE book.price
RETURN book
类似于
ALTER TABLE BOOK REMOVE COLUMN PRICE;
SELECT * FROM BOOK WHERE ID = 122;
一个节点可以对应多个标签
一个节点的多个标签可以使用remove来进行删除,就和删除属性的一样
有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。
要做到这一点,Neo4j CQL提供了一个SET子句。
Neo4j CQL已提供SET子句来执行以下操作。
MATCH (dc:DebitCard)
RETURN dc
MATCH (dc:DebitCard)
SET dc.atm_pin = 3456
RETURN dc
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name DESC
注意:order by 在return关键字之后
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
注意 -
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number
这里既有信用卡式和借记卡具有相同的属性名:身份证和号码,但他们有不同的节点名称前缀。这就是为什么UNION命令显示此错误消息。为了避免这种错误,Neo4j的CQL提供“AS”子句。
MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to
注意 -
使用union 的话,注意返回属性别名同意,防止语法报错
和是sql种使用一样
跳过多少条数据
MATCH (emp:Employee)
RETURN emp
SKIP 2
MERGE = CREATE + MATCH
MERGE命令检查该节点在数据库中是否可用。 如果它不存在,它创建新节点。 否则,它不创建新的。
Neo4j使用CQL MERGE命令 -
CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})
CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})
创建属性相同的两个节点,内部属性都是相同的,但是他们的内置的节点id是不同的。
和sql使用的语法相同:not is null / is null
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
MATCH (e:Employee)
RETURN e.id,UPPER(e.name),e.sal,e.deptno
MATCH (e:Employee)
RETURN e.id,LOWER(e.name),e.sal,e.deptno
MATCH (e:Employee)
RETURN e.id,SUBSTRING(e.name,0,2),e.sal,e.deptno
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEWodTAV-1596973558447)(data:image/png?lastmodify=1596161393;base64,)]
MATCH (e:Employee) RETURN COUNT(*)
##关系函数
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN STARTNODE(movie)
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN ENDNODE(movie)
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN ID(a)
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN type(movie)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8sihKnw-1596973558449)(data:image/png?lastmodify=1596161393;base64,)]
针对属性来做索引
create index
drop index
CREATE INDEX ON :Customer (name)
DROP INDEX ON : ()
DROP INDEX ON :Customer (name)
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。 然后我们不能直接得到这个。 我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。
类似于是sql中的主键约定,唯一确定一条数据
但是又有的不同,
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
CREATE CONSTRAINT ON (cc:CreditCard)
ASSERT cc.number IS UNIQUE
DROP CONSTRAINT ON (cc:CreditCard)
ASSERT cc.number IS UNIQUE
MATCH (cc:CreditCard)
WHERE cc.number = 222222
DELETE cc
MATCH (cc:CreditCard)
RETURN cc.id,cc.number,cc.name,cc.expiredate,cc.cvv
CREATE (cc:CreditCard {id:22,number:222222,name:'AAA',
expiredate:'10/10/2017',cvv:222})
CREATE (cc:CreditCard {id:22,number:222222,name:'BBB',
expiredate:'10/10/2017',cvv:222})
以JAVA API以编程方式执行所有数据库操作。
它支持两种类型的API:
原生的Java API:纯JAVA API,用于执行数据库操作
Cypher Java API:执行所有CQL命令以执行数据库操作
MATCH (a)-[r:JVM_LANGIAGES]->(b)
RETURN r
注意 -
如果我们的Neo4j服务器通过引用我们新创建的数据库启动和运行,那么我们不能执行我们的程序,因为服务器已经锁定了这个数据库。
所以当我们执行我们以前的程序时,我们会得到一些错误堆栈跟踪
java.io.IOException:C:\TPNeo4jDB\lock because another process already holds the lock.
为了避免这个问题,首先停止我们的服务器,然后执行程序。
因为默认情况下Neo4j DB Server一次只接受一个锁。 在实时应用程序中,Ne04J DBA人员将更新数据库属性以允许一次允许一些数量的锁。
Neo4j的原生的Java API,可以适用但是操作太过繁琐,打算放弃。
Neo4j Cypher Java API在测试的时候没用跑通,可能是没有引入正确的包
目前,打算放弃来,调研下一种方式drive方式来操作数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZdys5Hh-1596973558450)(data:image/png?lastmodify=1596161393;base64,)]
create (小北:朋友圈{姓名:"小北", 喜欢的书类:"Poetry"}),
(小菲:朋友圈{姓名:"小菲", 喜欢的书类:"Science Fiction"}),
(小鹏:朋友圈{姓名:"小鹏", 喜欢的书类:"Music"}),
(小颖:朋友圈{姓名:"小颖", 喜欢的书类:"Politics"}),
(小兰:朋友圈{姓名:"小兰", 喜欢的书类:"Music"}),
(小峰:朋友圈{姓名:"小峰", 喜欢的书类:"Travel"}),
(小讯:朋友圈{姓名:"小讯", 喜欢的书类:"Poetry"}),
(小东:朋友圈{姓名:"小东", 喜欢的书类:"Sequential Art"}),
(小唯:朋友圈{姓名:"小唯", 喜欢的书类:"Young Adult"}),
(小窦:朋友圈{姓名:"小窦", 喜欢的书类:"Poetry"}),
(小齐:朋友圈{姓名:"小齐", 喜欢的书类:"Default"}),
(小林:朋友圈{姓名:"小林", 喜欢的书类:"Poetry"}),
(小锐:朋友圈{姓名:"小锐", 喜欢的书类:"Default"}),
(小伟:朋友圈{姓名:"小伟", 喜欢的书类:"Young Adult"}),
(小玲:朋友圈{姓名:"小玲", 喜欢的书类:"Business"}),
(小讯)-[:认识]->(小窦),
(小讯)-[:认识]->(小齐),
(小讯)-[:认识]->(小林),
(小讯)-[:认识]->(小鹏),
(小讯)-[:认识]->(小伟),
(小讯)-[:认识]->(小峰),
(小菲)-[:认识]->(小鹏),
(小菲)-[:认识]->(小峰),
(小菲)-[:认识]->(小唯),
(小峰)-[:认识]->(小北),
(小峰)-[:认识]->(小兰),
(小东)-[:认识]->(小林),
(小东)-[:认识]->(小锐),
(小东)-[:认识]->(小菲),
(小鹏)-[:认识]->(小颖),
(小北)-[:认识]->(小兰),
(小颖)-[:认识]->(小东),
(小唯)-[:认识]->(小鹏),
(小唯)-[:认识]->(小锐),
(小伟)-[:认识]->(小玲)
match (n) detach delete n
删除节点时,如果该节点存在关系,则必须先删除关系
[
{
"keys": [
"n"
],
"length": 1,
"_fields": [
{
"start": {
"identity": {
"low": 1,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小讯",
"喜欢的书类": "Poetry"
}
},
"end": {
"identity": {
"low": 17,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小锐",
"喜欢的书类": "Default"
}
},
"segments": [
{
"start": {
"identity": {
"low": 1,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小讯",
"喜欢的书类": "Poetry"
}
},
"relationship": {
"identity": {
"low": 20,
"high": 0
},
"start": {
"low": 1,
"high": 0
},
"end": {
"low": 30,
"high": 0
},
"type": "认识",
"properties": {}
},
"end": {
"identity": {
"low": 30,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小林",
"喜欢的书类": "Poetry"
}
}
},
{
"start": {
"identity": {
"low": 30,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小林",
"喜欢的书类": "Poetry"
}
},
"relationship": {
"identity": {
"low": 29,
"high": 0
},
"start": {
"low": 20,
"high": 0
},
"end": {
"low": 30,
"high": 0
},
"type": "认识",
"properties": {}
},
"end": {
"identity": {
"low": 20,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小东",
"喜欢的书类": "Sequential Art"
}
}
},
{
"start": {
"identity": {
"low": 20,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小东",
"喜欢的书类": "Sequential Art"
}
},
"relationship": {
"identity": {
"low": 30,
"high": 0
},
"start": {
"low": 20,
"high": 0
},
"end": {
"low": 17,
"high": 0
},
"type": "认识",
"properties": {}
},
"end": {
"identity": {
"low": 17,
"high": 0
},
"labels": [
"朋友圈"
],
"properties": {
"姓名": "小锐",
"喜欢的书类": "Default"
}
}
}
],
"length": 3
}
],
"_fieldLookup": {
"n": 0
}
}
]
[
{
"key":"n",
"value":{
"adapted":{
"nodes":[
{
"labels":[
"朋友圈"
],
"id":1,
"properties":{
"姓名":{
"val":"小讯"
},
"喜欢的书类":{
"val":"Poetry"
}
}
},
{
"labels":[
"朋友圈"
],
"id":30,
"properties":{
"姓名":{
"val":"小林"
},
"喜欢的书类":{
"val":"Poetry"
}
}
},
{
"labels":[
"朋友圈"
],
"id":20,
"properties":{
"姓名":{
"val":"小东"
},
"喜欢的书类":{
"val":"Sequential Art"
}
}
},
{
"labels":[
"朋友圈"
],
"id":17,
"properties":{
"姓名":{
"val":"小锐"
},
"喜欢的书类":{
"val":"Default"
}
}
}
],
"relationships":[
{
"start":1,
"end":30,
"type":"认识",
"id":20,
"properties":{
}
},
{
"start":20,
"end":30,
"type":"认识",
"id":29,
"properties":{
}
},
{
"start":20,
"end":17,
"type":"认识",
"id":30,
"properties":{
}
}
],
"segments":[
{
"start":{
"labels":[
"朋友圈"
],
"id":1,
"properties":{
"姓名":{
"val":"小讯"
},
"喜欢的书类":{
"val":"Poetry"
}
}
},
"relationship":{
"start":1,
"end":30,
"type":"认识",
"id":20,
"properties":{
}
},
"end":{
"labels":[
"朋友圈"
],
"id":30,
"properties":{
"姓名":{
"val":"小林"
},
"喜欢的书类":{
"val":"Poetry"
}
}
}
},
{
"start":{
"labels":[
"朋友圈"
],
"id":30,
"properties":{
"姓名":{
"val":"小林"
},
"喜欢的书类":{
"val":"Poetry"
}
}
},
"relationship":{
"start":20,
"end":30,
"type":"认识",
"id":29,
"properties":{
}
},
"end":{
"labels":[
"朋友圈"
],
"id":20,
"properties":{
"姓名":{
"val":"小东"
},
"喜欢的书类":{
"val":"Sequential Art"
}
}
}
},
{
"start":{
"labels":[
"朋友圈"
],
"id":20,
"properties":{
"姓名":{
"val":"小东"
},
"喜欢的书类":{
"val":"Sequential Art"
}
}
},
"relationship":{
"start":20,
"end":17,
"type":"认识",
"id":30,
"properties":{
}
},
"end":{
"labels":[
"朋友圈"
],
"id":17,
"properties":{
"姓名":{
"val":"小锐"
},
"喜欢的书类":{
"val":"Default"
}
}
}
}
]
}
}
}
]
说明:本笔记大部分内容摘自某位帅气的同事的分享笔记,在这里表示感谢