一. 简介
neo4j是当今最流行的图数据库,基于 节点+关系 的架构,保存了图形数据的基本元素。同时,数据库也支持通过基础数据元素和独特的CQL查询语法,快速方便的检索、构建复杂的图表关系结果。
二. 基础知识
windows安装方法: 安装方法
CQL基本语法:基本语法
三. 实例
我想构建一个父子继承关系的图表结构,以苏洵苏轼家族为例,先建节点node如下:
-
create(
suxun
:Person_{
name:
"苏洵",age:
80,sex:
"男"})
-
create(
sushi
:Person_{
name:
"苏轼",age:
53,sex:
"男"})
-
create(
suzhe
:Person_{
name:
"苏辙",age:
51,sex:
"男"})
-
create(
suxiaomei
:Person_{
name:
"苏小妹",age:
45,sex:
"女"})
-
create(
susun
:Person_{
name:
"苏孙",age:
29,sex:
"男"})
-
create(
suxiaosun
:Person_{
name:
"苏重孙",age:
6,sex:
"女"})
其中有些节点人名为虚构,为了创建实例方便。 因为我数据库中先前已有Person标签名做了其他的测试,为避免重复和歧义,本例中标签名起为"Person_"。
对于节点之间的关系,为 :
苏洵-------|------苏轼 --------------苏孙 ---------------苏重孙
|------苏辙
|------苏小妹
因此创建结构的CQL为:
-
match(p1:Person_),(p2:Person_)
-
where p1.name=
"苏洵"
and p2.name =
"苏轼"
-
create (p1) -[
parent:
Parent{relation:
"父亲"}]-> (p2);
-
-
match(p1:Person_),(p2:Person_)
-
where p1.name=
"苏洵"
and p2.name =
"苏辙"
-
create (p1) -[
parent:
Parent{relation:
"父亲"}] -> (p2);
-
-
match(p1:Person_),(p2:Person_)
-
where p1.name=
"苏洵"
and p2.name =
"苏小妹"
-
create (p1) -[
parent:
Parent{relation:
"父亲"}] -> (p2);
-
-
match(p1:Person_),(p2:Person_)
-
where p1.name=
"苏轼"
and p2.name =
"苏孙"
-
create (p1) -[
parent:
Parent{relation:
"父亲"}] -> (p2);
-
-
match(p1:Person_{name:
"苏孙"}),(p2:Person_{name:
"苏重孙"})
-
create (p1) -[
parent:
Parent{relation:
"父亲"}] -> (p2);
其中有两种方法:
- 第一种用where进行节点筛选,例如 where p1.name="苏洵" and p2.name = "苏轼"
- 第二种用属性进行节点筛选,例如match(p1:Person_{name:"苏孙"}),(p2:Person_{name:"苏重孙"})
两种方法都可以达到效果
最终结果为:
match(a)-[r:Parent]->(b) return a, r, b
使用match进行筛选,并且拼装成树状结构:
1. 筛选出子孙绵延四代的树干
match(a)-[r1:Parent]->(b)-[r2:Parent]->(c)-[r3:Parent]->(d) return a, b, c, d
2. 筛选出存在三代子孙的树干
match(a)-[r1:Parent]->(b)-[r2:Parent]->(c) return a, b, c
可以发现,查出来的图形虽然是只有一条链路,但其实代表两条数据,各三级节点,如下
那如果要查询某个节点开始的三级结构呢?
3. 筛选出某个节点为顶点的三代子孙树干
match(a{name:"苏洵"})-[r1:Parent]->(b)-[r2:Parent]->(c) return a, b, c
这样就只筛选得到的是以“苏洵”为顶点的三级结构,依次是“苏洵”-->“苏轼”-->“苏孙”
可看到只有一条数据
原文地址:https://blog.csdn.net/u010086122/article/details/82390945