1. 前言
这段时间由于项目需要用Neo4j数据库,所以不得不简单学习一下。突然听到了一个以前没听到过的名字,心里好奇,网上一查,说它目前最流行的图形数据库(咱竟然没听过,个人觉得图数据库确实很优秀,但其目前还没有能广泛商用的能力,成熟度还不够)。
Neo4j的特点在于数据模型是图结构的,注意,这里并没有说数据存储也一定是图结构的。在Neo4j的世界里,就只有三样东西:实体,关系,属性(这是完全按照图的思维设计的,不同于RDF数据,neo4j里面的关系也是有属性的)。在数据存储方面,节点的类别,属性,边的类别,属性等都是分开存储的(据说可以大幅提高性能,咱也不知道为啥,有资料说其中每个节点都存了一个指向其邻居节点的指针,因此可以在O(1)时间内找到其邻居节点)。相比于关系型数据库,图数据库最大的特点就是更直观;其次,在数据量较大时,关系型数据库需要建立多张表并且需要太多连接操作。
2. 基础
对于Neo4j的入门安装以及使用此处就不做赘述了。此处提一点,Neo4j分为社区版和企业版,企业版的功能多,提供了分布式集群,但企业版貌似新版本不再开源,以后要收钱。这里为了方便以后查阅和复习,把项目中常用到的Cypher语句罗列一下(关键字我都用大写,实际不区分大小写,还有,CQL中字符串双引号单引号都可):
1.创建节点,多个属性用逗号隔开
CREATE (:Person{name:"张三"})
2.创建边,多个属性用逗号隔开。注意,这里用merge是防止重复插入边,也可以用create
MATCH (a{name:"张三"}),(b{name:"李四"}) MERGE (a)-[:同学{time:"2年"}]->(b)
3.创建索引
CREATE INDEX ON :Person(name)
4.查看索引
:SCHEMA
5.where语句,其中<>是不等于
MATCH (a:Person),(b:Person)
WHERE a.name='张三' AND b.name<>'李四'
RETURN a,b
6.更新
MATCH (n:Person{name:'张三'})
SET n.name='zhangsan'
6.删除节点和与其相连的边。Neo4j中如果一个节点有边相连,是不能只删除这个节点的。
MATCH (n:Person{name:'张三'})
DETACH DELETE n;
7.查询最短路径