Neo4j基本操作

411 阅读5分钟

0. 安装

我是mac直接执行

brew install neo4j

1. 基本语法学习

1.1 CREATE

CREATE (
   <node-name>:<label-name>
   { 	
      <Property1-name>:<Property1-Value>
      ........
      <Propertyn-name>:<Propertyn-Value>
   }
)
语法元素描述
<node-name>它是我们将要创建的节点名称。
<label-name> 它是一个节点标签名称
<Property-name>属性是键值对。 定义将分配给创建节点的属性的名称
<Property-value>属性是键值对。 定义将分配给创建节点的属性的值

这个node-name好像并不是很重要,类似于一个占位符,应该是数据库内存自己处理逻辑的时候会用到

示例 创建一个Dept标签节点,它拥有如下属性

  • deptno
  • dname
  • location
CREATE (
    dept:Dept { 
          deptno:10,
          dname:"Accounting",
          location:"Hyderabad" 
      }
)

1.2 MATCH

MATCH 
(
   <node-name>:<label-name>
)
语法元素描述
<node-name>这是我们要创建一个节点名称。
<label-name>这是一个节点的标签名称

示例

# 查询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

这个一般是和RETURN连起来用

1.3 RETURN

RETURN 
   <node-name>.<property1-name>,
   ........
   <node-name>.<propertyn-name>
语法元素描述
<node-name> 它是我们将要创建的节点名称。
<Property-name>属性是键值对定义要分配给创建节点的属性的名称

1.4 MATCH & RETURN匹配和返回

这里有点类似SQL中的select选择属性返回 示例

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

1.5 关系

基于方向性,Neo4j关系被分为两种主要类型。

  • 单向关系
  • 双向关系 在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。
  • 在两个现有节点之间创建无属性的关系
  • 在两个现有节点之间创建有属性的关系
  • 在两个新节点之间创建无属性的关系
  • 在两个新节点之间创建有属性的关系
  • 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系

每个关系(→)包含两个节点

  • 从节点
  • 到节点 分别对应两个关系
  • 外向关系
  • 传入关系

创建关系

# 先找到这两种节点
MATCH (e:Customer),(cc:CreditCard) 
# 创建关系
CREATE (e)-[r:DO_SHOPPING_WITH ]->(cc) 

查找关系

# 匹配出关系
MATCH (e)-[r:DO_SHOPPING_WITH ]->(cc) 
# 返回关系,当然也可以返回e和cc把节点一起返回
RETURN r

1.6 WHERE

# 简单
WHERE <condition>
# 复杂
WHERE <condition> <boolean-operator> <condition>

<condition>语法:

<property-name> <comparison-operator> <value>

示例

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

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

和创建关系联系起来

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

1.7 DELETE

DELETE <node-name-list>

注意

我们应该使用逗号(,)运算符来分隔节点名。

示例

MATCH (e: Employee) DELETE e

显然把之前的RETURN关键字改为RETURN就能实现想要的效果,比如我们也能删除关系,如下

MATCH (cc: CreditCard)-[rel]-(c:Customer) 
DELETE cc,c,rel

1.8 REMOVE

  • DELETE是删除节点关系
  • REMOVE是删除标签属性
REMOVE <property-name-list>

<property-name-list> 语法

<node-name>.<property1-name>,
<node-name>.<property2-name>, 
.... 
<node-name>.<propertyn-name> 

注意

  • 我们应该使用逗号(,)运算符来分隔标签名称列表。
  • 我们应该使用dot(。)运算符来分隔节点名称和标签名称。

示例

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

1.9 SET

  • 向现有的节点和关系添加新的属性
  • 添加或更改属性值
SET  <property-name-list>

<property-name-list>语法

<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>, 
.... 
<node-label-name>.<propertyn-name> 

示例

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

1.10 ORDER BY

默认DESC 降序

ORDER BY  <property-name-list>  [DESC]	 

示例

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

1.11 UNION

它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。

<MATCH Command1>
   UNION
<MATCH Command2>

示例

注意 合并的字句应该有相同的列名,如下会报错,因为前缀不一样

MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number

为了解决上述问题使用关键字AS

MATCH (cc:CreditCard)
RETURN 
cc.id as id,
cc.number as number,
cc.name as name,
cc.valid_from as valid_from,
cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN 
dc.id as id,
dc.number as number,
dc.name as name,
dc.valid_from as valid_from,
dc.valid_to as valid_to

1.12 UNION ALL

UNION不同点:它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

<MATCH Command1>
UNION ALL
<MATCH Command2>

1.13 LIMIT 和 SKIP

一个是限制条数,一个是起始行数,显然可以用这个来做分页

LIMIT <number>
SKIP <number>

示例

MATCH (emp:Employee) 
RETURN emp
SKIP 2
LIMIT 2

1.14 MERGE

MERGE命令在图中搜索给定模式

  • 如果存在,则返回结果
  • 如果它不存在于图中,则它创建新的节点/关系并返回结果
MERGE = CREATE + MATCH

示例

MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})

2.实战

先有如下树形结构数据,将其存储

  • 查找算法
    • 顺序查找
      • 算法原理
      • 岗哨、哨兵
      • 程序实现
    • 折半查找
      • 算法原理
      • 程序实现
      • 递归算法
      • 判定树
        • 判定树原理
        • 判定树与具体数值无关
    • 索引顺序查找
      • 数据特点:分块有序
      • 索引表数据结构
      • 性能分析

2.1 存储节点

create(a:NODE{name:"查找算法",deep:"1",id:1});

create(a:NODE{name:"顺序查找",deep:"2",id:2,parentid:1});
create(a:NODE{name:"折半查找",deep:"2",id:3,parentid:1});
create(a:NODE{name:"索引顺序查找",deep:"2",id:4,parentid:1});

create(a:NODE{name:"算法原理",deep:"3",id:5,parentid:2});
create(a:NODE{name:"岗哨、哨兵",deep:"3",id:6,parentid:2});
create(a:NODE{name:"程序实现",deep:"3",id:7,parentid:2});

create(a:NODE{name:"算法原理",deep:"3",id:8,parentid:3});
create(a:NODE{name:"程序实现",deep:"3",id:9,parentid:3});
create(a:NODE{name:"递归算法",deep:"3",id:10,parentid:3});
create(a:NODE{name:"判定树",deep:"3",id:11,parentid:3});


create(a:NODE{name:"数据特点:分块有序",deep:"3",id:12,parentid:4});
create(a:NODE{name:"索引表数据结构",deep:"3",id:13,parentid:4});
create(a:NODE{name:"性能分析",deep:"3",id:14,parentid:4});

create(a:NODE{name:"判定树原理",deep:"4",id:15,parentid:11});
create(a:NODE{name:"判定树与具体数值无关",deep:"4",id:16,parentid:11});



2.2建立关系

match(parent:NODE),(child:NODE) where parent.id = child.parentid
create (parent)-[l:LINk{name:"包含"}]->(child)

成图

image.png

一些常用操作

删除所有关系和节点

match (e)-[l]->(x) delete e,l,x
match (n) delete n