实践Neo4j之一介绍

Neo4j是一种图数据库,图,由节点和线组成,节点代表实体,线代表关系,非常适合于表示实体及实体关系丰富的场景,也符合人的思维习惯。在关系型数据库中一般通过引入第三张表来表示两个实体的关系。从建模上讲,差别还不是绝对的大,而如果对于关系需求较高,核心差异就体现出来了。可以说图数据库也正式是基于这个原因而生的。

图数据库 VS 关系型数据库

以社交网络里的用户及用户的朋友这个场景为例,对比关系型数据库和图数据库。

social network

关系型数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 用户表
create table t_user (
id bigint not null,
name varchar(255) not null,
primary key (id)
);

-- 用户关系表
create table t_user_friend (
id bigint not null,
friendship relations
user_1 bigint not null,
user_2 bigint not null,
primary key (id)
);

-- 索引和外键
alter table t_user_friend
add index FK416055ABC6132571 (user_1),
add constraint FK416055ABC6132571
foreign key (user_1) references t_user (id);
alter table t_user_friend
add index FK416055ABC6132572 (user_2),
add constraint FK416055ABC6132572
foreign key (user_2) references t_user (id);
1
2
3
4
5
6
7
8
9
10
11
-- 推荐朋友的朋友
-- friends of friends of a user
select count(distinct uf2.*) from t_user_friend uf1
inner join t_user_friend uf2 on uf1.user_1 = uf2.user_2
where uf1.user_1 = ?

-- friends of friends of friends of a user
select count(distinct uf3.*) from t_user_friend uf1
inner join t_user_friend uf2 on uf1.user_1 = uf2.user_2
inner join t_user_friend uf3 on uf2.user_1 = uf3.user_2
where uf1.user_1 = ?

Execution times for multiple join queries using a MySQL database engine on a data set of 1,000 users

Execution times for multiple join queries using a MySQL database engine on a data set of 1 million users

图数据库

1
2
3
4
5
TraversalDescription traversalDescription = Traversal.description()
.relationships("IS_FRIEND_OF", Direction.OUTGOING)
.evaluator(Evaluators.atDepth(2))
.uniqueness(Uniqueness.NODE_GLOBAL);
Iterable<Node> nodes = traversalDescription.traverse(nodeById).nodes();

The execution times for graph traversal using Neo4j on a data set of 1,000 users

The execution times for graph traversal using Neo4j on a data set of 1 million users

支持ACID

Schema-Less