HacKerQWQ的博客空间

neo4j图形数据库笔记

Word count: 2kReading time: 8 min
2022/10/01 Share

neo4j数据库安装

从官网下载neo4j Desktop

https://neo4j.com/download/?ref=get-started-dropdown-cta

neo4j介绍

简单查看

1
2
:schema //查看表库
:sysinfo //查看数据库信息

Neo4j的特点

  • SQL就像简单的查询语言Neo4j CQL
  • 它遵循属性图数据模型
  • 它通过使用Apache Lucence支持索引
  • 它支持UNIQUE约束
  • 它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
  • 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
  • 它采用原生图形库与本地GPE(图形处理引擎)
  • 它支持查询的数据导出到JSON和XLS格式
  • 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
  • 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
  • 它支持两种Java API:Cypher API和Native Java API来开发Java应用程序

Neo4j的优点

  • 它很容易表示连接的数据
  • 检索/遍历/导航更多的连接数据是非常容易和快速的
  • 它非常容易地表示半结构化数据
  • Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
  • 使用简单而强大的数据模型
  • 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引

Neo4j数据模型

图形数据库数据模型的主要构建块是:

  • 节点
  • 关系
  • 属性

简单的属性图的例子

属性图的例子

这里我们使用圆圈表示节点。 使用箭头的关系。 关系是有方向性的。 我们可以用Properties(键值对)来表示Node的数据。 在这个例子中,我们在Node的Circle中表示了每个Node的Id属性。

Neo4j图形理论

  • 图是一组节点和连接这些节点的关系。图形数据存储在节点和关系在属性的形式。属性是键值对表示数据。

在图形理论中,我们可以表示一个带有圆的节点,节点之间的关系用一个箭头标记表示。

最简单的可能图是单个节点。

profile

我们可以使用节点表示社交网络(如Google+(GooglePlus)个人资料)。 它不包含任何属性。

向 Google+个人资料添加一些属性

profile node

此节点包含一组属性。 属性是一个名称:值对。

在两个节点之间创建关系

在两个节点之间创建关系

此处在两个配置文件之间创建关系名称“跟随”(Follows)。 这意味着 Profile-I 遵循 Profile-II。

复杂的示例图

复杂示例

这里节点用关系连接。 关系是单向或双向的。

  • 从PQR到XYZ的关系是单向关系。
  • 从ABC到PQR的关系是双向关系。

CQL语法

查看基本信息

1
2
:schema //查看表库
:sysinfo //查看数据库信息

Neo4j命令

常用的Neo4j CQL命令/条款如下:

S.No. CQL命令/条 用法
1。 CREATE 创建 创建节点,关系和属性
2。 MATCH 匹配 检索有关节点,关系和属性数据
3。 RETURN 返回 返回查询结果
4。 WHERE 哪里 提供条件过滤检索数据
5。 DELETE 删除 删除节点和关系
6。 REMOVE 移除 删除节点和关系的属性
7。 ORDER BY以…排序 排序检索数据
8。 SET 组 添加或更新标签

Neo4j CQL 函数

以下是常用的Neo4j CQL函数:

S.No. 定制列表功能 用法
1。 String 字符串 它们用于使用String字面量。
2。 Aggregation 聚合 它们用于对CQL查询结果执行一些聚合操作。
3。 Relationship 关系 他们用于获取关系的细节,如startnode,endnode等。

我们将在后面的章节中详细讨论所有Neo4j CQL命令,子句和函数语法,用法和示例。

Neo4j CQL数据类型

这些数据类型与Java语言类似。 它们用于定义节点或关系的属性

Neo4j CQL支持以下数据类型:

S.No. CQL数据类型 用法
1. boolean 用于表示布尔文字:true,false。
2. byte 用于表示8位整数。
3. short 用于表示16位整数。
4. int 用于表示32位整数。
5. long 用于表示64位整数。
6. float I用于表示32位浮点数。
7. double 用于表示64位浮点数。
8. char 用于表示16位字符。
9. String 用于表示字符串。

CQL常见语法

数据库相关

1
2
3
4
# 列数据库
:dbs
# 进入数据库
:use neo4j

CREATE

创建单标签无属性节点

1
CREATE (emp:Employee)

创建多标签无属性节点

1
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)

创建有属性节点

1
CREATE (dept:Dept {deptno:10,dname:"Accounting",location:"Guangzhou"})

image-20221001101903607

创建有关系的节点

1
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2)

image-20221001200227186

MATCH

MATCH用于查询数据

1
2
3
4
5
6
7
8
9
MATCH 
(
<node-name>:<label-name>
)

# 正则表示
MATCH (n)
WHERE n.Text =~ '.*\\bword\\b.*'
RETURN n;

需要搭配其他条件使用

1
2
3
4
5
6
7
8
9
10
11
12
# 查询所有节点
MATCH (n) RETURN n
# 查询Dept下的内容
MATCH (dept:Dept) return dept

# 查询Employee标签下 id=123,name="Lokesh"的节点
MATCH (p:Employee {id:123,name:"Lokesh"}) RETURN p

## 查询Employee标签下name="Lokesh"的节点,使用(where命令)
MATCH (p:Employee)
WHERE p.name = "Lokesh"
RETURN p

image-20221001102614607

CQL RETURN子句用于 -

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

RETURN命令语法:

1
2
3
4
RETURN 
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>

MATCH-RETURN组合用法

1
2
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname

image-20221001103134021

WHERE

where子句跟mysql差不多

例子

1
2
3
MATCH (emp:Employee) 
WHERE emp.name = 'Abc'
RETURN emp

比较运算符

1
2
3
4
5
6
=
<>
<
>
<=
>=

布尔运算符

1
2
3
4
AND
OR
NOT
XOR

运用布尔运算符

1
2
3
MATCH (emp:Employee) 
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp

使用WHERE子句筛选结果,并使用CREATE创建关系

1
2
3
4
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

image-20221001200915878

关系相关操作

从已有节点创建关系

1
2
3
4
5
6
#无属性关系
MATCH (e:Customer),(cc:CreditCard)
CREATE (e)-[r:DO_SHOPPING_WITH ]->(cc)
#有属性关系
MATCH (e:Customer),(cc:CreditCard)
CREATE (e)-[r:DO_SHOPPING_WITH{Do_Shopping_Date:"01/10/2022"} ]->(cc)

从新节点创建关系

1
2
3
4
#无属性关系
CREATE (e:Customer)-[r:DO_SHOPPING_WITH ]->(cc:CreditCard)
#有属性关系
CREATE (e:Customer)-[r:DO_SHOPPING_WITH{Do_Shopping_Date:"01/10/2022"} ]->(cc:CreditCard)

检索关系

1
2
MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) 
RETURN cust,cc

image-20221001201740837

DELETE

删除节点

1
MATCH (e:Employee) DELETE e

可以搭配WHERE进行精确删除

删除节点及关系

1
2
3
4
5
6
# 删除两个节点及其所有关系
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel
# 仅删除两个节点间关系
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE rel

属性相关操作

删除属性

1
MATCH (book:Book{id:122}) REMOVE book.price RETURN book

这里删除了book的id为122的节点的price属性

设置属性

1
MATCH(book:Book) SET book.title = 'superstar' RETURN book

image-20221001203506136

ORDERBY

跟mysql完全相同

1
2
3
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name

UNION

UNION联合查询数据(去重)

1
2
3
4
5
MATCH (stu:Chinese) 
RETURN stu
UNION
MATCH (stu:Internation)
RETURN stu

image-20221001204050379

UNION ALL联合查询数据(不去重)

1
2
3
4
5
MATCH (stu:Chinese) 
RETURN stu
UNION ALL
MATCH (stu:Internation)
RETURN stu

image-20221001204131642

LIMIT&SKIP

使用LIMIT进行限制查询

1
2
3
MATCH (stu:Internation) 
RETURN stu
LIMIT 1

使用SKIP进行结果跳过输出

1
2
3
MATCH (stu:Internation) 
RETURN stu
SKIP 1

image-20221001204439929

MERGE

merge相当于create的合并版本,存在节点/关系就忽略,没有就创建

1
2
3
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})
MATCH (gp2:GoogleProfile) RETURN gp2

最终结果只有一条数据

image-20221001204818593

IN操作符

1
2
3
MATCH (e:Employee) 
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
CATALOG
  1. 1. neo4j数据库安装
  2. 2. neo4j介绍
    1. 2.1. Neo4j的特点
    2. 2.2. Neo4j的优点
    3. 2.3. Neo4j数据模型
    4. 2.4. Neo4j图形理论
  3. 3. CQL语法
    1. 3.1. Neo4j命令
    2. 3.2. Neo4j CQL 函数
    3. 3.3. Neo4j CQL数据类型
    4. 3.4. CQL常见语法
      1. 3.4.1. 数据库相关
      2. 3.4.2. CREATE
      3. 3.4.3. MATCH
      4. 3.4.4. WHERE
      5. 3.4.5. 关系相关操作
      6. 3.4.6. DELETE
      7. 3.4.7. 属性相关操作
      8. 3.4.8. ORDERBY
      9. 3.4.9. UNION
      10. 3.4.10. LIMIT&SKIP
      11. 3.4.11. MERGE
      12. 3.4.12. IN操作符