图数据库neo4j使用笔记

neo4j安装

参照博客:

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

Java项目中配置(服务器式数据库)

pom中引入依赖

         
         
             org.neo4j.driver
             neo4j-java-driver
             1.6.1
         

yml文件中引入数据连接关键配置

结合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注解来获取到配置文件指定值

构建neo4j的工具类

获取驱动
业务+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,)]

CREATE

MATCH (ee: Person) DELETE ee

创建一个没有属性的节点 create

 CREATE (:)
 CREATE (ee:Person)
注意事项 -

1、Neo4j数据库服务器使用此将此节点详细信息存储在Database.As中。
作为Neo4j DBA或Developer,我们不能使用它来访问节点详细信息。
2、Neo4j数据库服务器创建一个作为内部节点名称的别名。
作为Neo4j DBA或Developer,我们应该使用此标签名称来访问节点详细信息。
解锁数据通过标签来检索,而不是节点名称来检索

Neo4j CQL创建具有属性的节点

Neo4j CQL“CREATE”命令用于创建带有属性的节点。 它创建一个具有一些属性(键值对)的节点来存储数据

 CREATE (
    :
    {    
       :
       ........
       :
    }
 )
 CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUs4bGjk-1596973558443)(data:image/png?lastmodify=1596161393;base64,)]

注意 -

要定义字符串类型属性值,我们需要使用单引号或双引号。

在没有属性的节点之间创建关系

使用属性创建节点之间的关系

为节点或关系创建单个或多个标签


MATCH

从数据库获取有关节点和属性的数据

 MATCH 
 (
    :
 )

从数据库获取有关节点,关系和属性的数据

match关键子不能单独使用,需要结合return或者update关键字来使用

RETURN

  1. 检索节点的某些属性
  2. 检索节点的所有属性
  3. 检索节点和关联关系的某些属性
  4. 检索节点和关联关系的所有属性
 RETURN 
    .,
    ........
    .

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ebk6jnJ-1596973558446)(data:image/png?lastmodify=1596161393;base64,)]

MATCH + RETURN

在Neo4j CQL中,我们不能单独使用MATCH或RETURN命令,因此我们应该合并这两个命令以从数据库检索数据。

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性
 MATCH (dept: Dept)
 RETURN dept.deptno,dept.dname

个人觉的,节点名称当作别名来使用了

 MATCH (dept: Dept)
 RETURN dept

上面的cql返回的是ui的结果

WHERE

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

DELETE

 MATCH (e: Employee) DELETE e
 ​
 MATCH (cc: CreditCard)-[rel]-(c:Customer) 
 DELETE cc,c,rel

REMOVE

SET子句向现有节点或关系添加新属性。
REMOVE子句来删除节点或关系的现有属性。

REMOVE命令用于

  • 删除节点或关系的标签
  • 删除节点或关系的属性

DELETE和REMOVE命令之间的主要区别 -

  • DELETE操作用于删除节点和关联关系。
  • REMOVE操作用于删除标签和属性。

DELETE和REMOVE命令之间的相似性 -

  • 这两个命令不应单独使用。
  • 两个命令都应该与MATCH命令一起使用。

从数据库中永久删除节点或关系的属性或属性列表
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来进行删除,就和删除属性的一样

SET

有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。
要做到这一点,Neo4j CQL提供了一个SET子句。
Neo4j CQL已提供SET子句来执行以下操作。

  • 向现有节点或关系添加新属性
  • 添加或更新属性值
 MATCH (dc:DebitCard)
 RETURN dc
 ​
 MATCH (dc:DebitCard)
 SET dc.atm_pin = 3456
 RETURN dc

Sorting

 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关键字之后

UNION

与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果

  • UNION
  • UNION ALL

注意 -
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。

 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 的话,注意返回属性别名同意,防止语法报错

LIMIT

和是sql种使用一样

SKIP

跳过多少条数据

 MATCH (emp:Employee) 
 RETURN emp
 SKIP 2

MERGE

MERGE = CREATE + MATCH
MERGE命令检查该节点在数据库中是否可用。 如果它不存在,它创建新节点。 否则,它不创建新的。
Neo4j使用CQL MERGE命令 -

  • 创建节点,关系和属性
  • 为从数据库检索数据
 CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})
 CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})

创建属性相同的两个节点,内部属性都是相同的,但是他们的内置的节点id是不同的。

NULL值

和sql使用的语法相同:not is null / is null

IN

 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)

UNIQUE约束

在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。 然后我们不能直接得到这个。 我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。

类似于是sql中的主键约定,唯一确定一条数据
但是又有的不同,
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束

UNIQUE约束的优点

  • 避免重复记录。
  • 强制执行数据完整性规则。

Neo4j CQL UNIQUE约束操作

  • 创建UNIQUE约束
  • 丢弃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})

Neo4j 和 Java

以JAVA API以编程方式执行所有数据库操作。

它支持两种类型的API:

  • Neo4j的原生的Java API
  • Neo4j Cypher Java 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方式来操作数据

neo4j集成spring data 模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZdys5Hh-1596973558450)(data:image/png?lastmodify=1596161393;base64,)]

Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径

准备数据

 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"
                                 }
                             }
                         }
                     }
                 ]
             }
         }
     }
 ]
 ​
   
 ​

说明:本笔记大部分内容摘自某位帅气的同事的分享笔记,在这里表示感谢

你可能感兴趣的:(学习笔记,数据库,neo4j)