简介:本文以电影关系图为例,解释neo4j图数据库中的基本概念
电影关系图
下图中的圆圈表示三个节点(node),每个节点都有表示类别的标签(label)和属性(properties),如:name、born、title、released,节点之间用单向箭头连接表示节点间的关系(relationships),如:ACTED_IN、DIRECTED
以下Cycher语句可生成上述图结构
CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})-[:ACTED_IN {roles: ['Forrest']}]->(:Movie {title: 'Forrest Gump'})<-[:DIRECTED]-(:Person {name: 'Robert Zemeckis', born: 1951})
节点 node
电影关系图中每一个圆圈都表示一个节点(node),每个节点表示一个实体,下面具体分析第一个节点
节点中的Person
、Actor
为节点的标签(label),能将有着相同标签的节点划分到同一个类中,类似于Java中类的概念。节点可拥有多个标签,标签间的关系类似于类间的关系(继承),本节点中Actor
可看做是Person
的子类;
name:'Tom Hanks' born:1956
为节点的属性(properties),类似于Java类中的属性
java实现代码如下
public class Person{
String name;
long born;
}
class Actor extends Person{}
该节点可由以下Cypher语句生成
CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})
语句解释:
- 创建节点所属的标签
:Person
、:Actor
- 以键值对(key-value pairs)的形式声明属性,并大括号
{}
括起
关系 relationship
描述相互连接的始末节点间如何关联(describes how a connection between a source node and a target node are related),关系可以将节点构成链表(list)、树(tree)、图(map)、复合实体。
特点:
- 有方向且单方向
- 必须有一个类型(type)以定义是何种关系
Must have a type (one type) to define (classify) what type of relationship it is. - 节点可以由指向自己的关系
- 关系可以有属性
上图关系的类型(type)是ACTED_IN
,属性为roles: ['Forrest']
、performance: 5
Cypher语句为:
CREATE ()-[:ACTED_IN {roles: ['Forrest'], performance: 5}]->()
()
表示节点
-[:ACTED_IN {roles: ['Forrest'], performance: 5}]->
为声明关系的语句,键值对同样表示属性(properties)
属性 properties
属性是以键值对的形式描述节点(node)和关系(relationships)的数据
属性可以是各种数据类型,如:number
、string
或boolean
;可以是存储同类数据的array或list,如:strings
、numbers
、bollean values
CREATE (:Example {a: 1, b: 3.14}) // 属性a存储integer类型的值1,属性b存储float类型的数据
CREATE (:Example {c: 'This is an example string', d: true, e: false})
CREATE (:Example {f: [1, 2, 3], g: [2.71, 3.14], h: ['abc', 'example'], i: [true, true, false]})
其他概念
图数据库中的其他概念暂时不做详述,如:Traversals(遍历)、paths(路径)、Schema、Indexes(索引)、Constraints(约束)
补充
电影数据库为neo4j的官方样例,可使用:guide movie-graph
命令查看。关于属性、标签等概念可以借助以下查询语句验证和理解。
Match (n)
return ID(n) as id, properties(n) AS properties, labels(n) AS label
neo4j中的命名规范
节点的标签、关系的类型、属性都是大小写敏感的,例如:属性name
≠Name
,一下为neo4j官方推荐的命名规范
Graph entity | Recommended style | Example |
---|---|---|
Node label | Camel case, beginning with an upper-case character | :VehicleOwner rather than :vehice_owner |
Relationship type | Upper case, using underscore to separate words | :OWNS_VEHICLE rather than :ownsVehicle |
Property | Lower camel case, beginning with a lower-case character | firstName rather than first_name |
对比图论
在图论中,节点也称为顶点(vertices )或点(point)
关系也称为边(edges)、链接(links)或线(lines)
创建节点
创建节点的语法中,可将节点名命名为n。因为节点名不作为唯一标识,类似于临时变量,使用相同的节点名不会影响数据库的创建
CREATE (n:Person {name:'Sally'}) RETURN n
CREATE (n:Person {name:'Steve'}) RETURN n
CREATE (n:Person {name:'Mike'}) RETURN n
neo4j图片导出
若导出为svg
,可使用vscode或notepad编辑内容,查找font-size
设置字体大小,查找font-family
设置字体格式,然后使用photoshop
将svg导出为png或借助在线转png的网站
neo4j交互设置
点击任一节点,出现一个灰色的圈,分别表示固定节点的位置、隐藏节点、显示与该节点有关系的其他节点
右侧点击节点的标签Person
,可以调整节点的颜色和大小
点击箭头,可以设置表示关系箭头的粗细和颜色
参考文章:
meo4j 4.4 官方文档 Graph database concepts
Neo4j图数据库中文文档—neo4j 0.1.0a documentation
基于Neo4j构建电影图谱 - 知乎 (zhihu.com)