# NeuroDB说明文档

# 简介

NeuroDB是一个内存级图数据库引擎,能够利用Neuro-cypher指令实现对图数据的创建、编辑、检索 以及建立在复杂图算法上的一些高级图应用。 NeuroDB的主要特性为:

  1. 轻量级:整个引擎的可执行程序仅有不到400KB
  2. 内存级:整个图数据被完全载入到内存中进行操作
  3. 高速:得益于整个数据库都在内存中,无硬盘读写延迟
  4. 可嵌入式:数据库可以嵌入到您项目里类似sqlite,无需单独部署运维
  5. 多平台:各主流操作系统(windows、Linux、Mac)以及手机操作系统(Android、IPhone)和任何可运行C语言目标程序的嵌入式系统或单片机(STM32)都可运行NeuroDB
  6. 精简化:类似Redis,以精简的操控指令、精简的部署运维、精简的软件架构 实现强大、高效、低资源消耗的图数据库引擎
  7. 全自主研发:提供图数据库国产替代方案
  8. 边缘计算:得益于NeuroDB的轻量级,其可嵌入到小型、微型设备上(芯片上) 实现"边缘计算"
  9. 图建模概念:NeuroDB的可视化客户端实现了类似面向对象根据模型“派生”图数据的概念,可在建模中设计图的节点、关系关联结构,并且可以向关系数据库表结构那样 设计节点或关系上的属性(属性名、属性数据类型、属性数据长度等)

本教程将以极简的风格,教会您在1小时内学会NeuroDB的所有技术!Here we go!

# 下载安装部署

  • 下载程序包部署: 安装部署前我们需要到“下载 (opens new window)”页面,下载您系统对应的版本的NeuroDB程序包。安装部署工作非常简单,只需要把下载的NeuroDB程序包解压到您习惯放软件的目录即可。
  • Docker部署:
docker pull panggguoming/neurodb:1.0.0

程序包目录如下:

image

其中

  • bin目录下是NeuroDB服务端与客户端可执行程序
  • data目录下是持久化存储的数据文件
  • import目录下是待导入的数据文件(csv文件)
  • logs目录下是运行日志

部署完毕后:

  • 启动bin目录下的NEURO_SERVER即可将NeuroDB服务启动,默认占用8839端口,如果想更换接口可以在后续“运维管理”章节讲如何修改。
  • 启动bin目录下的NEURO_CLI可以启动命令行客户端,此客户端默认链接本机8839端口,可通过添加参数host 127.0.0.1 port 8839 修改默认链接ip和端口,我们可以直接在客户端输入命令并查看执行结果。
  • 为了更形象、便捷的运行指令和查看结果,推荐下载安装“NeuroStudio (opens new window)”桌面版可视化客户端,“NeuroStudio”提供强大、友好的可视化UI组件提升我们操作图数据、展示图数据的体验,本教程中后续的实例将使用NeuroStudio截图展示结果。其安装、运行非常简单,下载解压后运行根目录下的“neuro-Studio.exe”即可。NeuroStudio”是可选安装包,如果用户只需要运行指令无需可视化展示,则不必下载安装“NeuroStudio”。

# 启动NeuroDB

# windows系统

将程序包解压到任意目录,运行bin目录下的NEURO_SERVER.exe,这是NeuroDB的服务端。 也可以在命令行下运行。 image 命令行客户端是NEURO_CLI.exe,服务端启动后再启动此程序即可,如需输入参数连接指定ip和端口的服务,则需在命令行中输入如下命令来启动。NEURO_CLI启动后在命令行中我们可以直接输入Neuro-Cypher命令执行并查看命令行结果。 image

# linux系统

将程序包解压到任意目录 赋予bin目录下的NEURO_SERVER可执行权限

chmod +x NEURO_SERVER

运行NEURO_SERVER即可

./NEURO_SERVER

或者可以使用nohub命令使之在后台运行

nohup ./NEURO_SERVER &

然后启动客户端,就可以连接到服务端并执行命令了

./NEURO_CLI

# Mac系统

将程序包解压到任意目录,运行bin目录下的NEURO_SERVER即可

./NEURO_SERVER

然后启动客户端,就可以连接到服务端并执行命令了

./NEURO_CLI

# 快速上手

# 创建人脉关系图实例

创建公司(Company)、人员(Person)节点,以及公司与人员的工作关系(WORK ),人员之间的朋友关系(FRIEND),从而构建一个简单的人脉关系网络

create  
  (Xiaomi:Company {name:"小米科技有限责任公司", create_at:2010, tagline:"致力于让全球每个人都能享受科技带来的美好生活"})
, (Alibaba:Company {name:"阿里巴巴集团控股有限公司", create_at:1999, tagline:"旨在构建未来的商业基础设施"})
, (Baidu:Company {name:"百度在线网络技术有限公司", create_at:2000, tagline:"是拥有强大互联网基础的领先AI公司"})
, (Leimou:Person {name:"雷某", born:1969})
, (Mamou:Person {name:"马某", born:1964})
, (Limou:Person {name:"李某", born:1968})
, (Chenmou:Person {name:"陈某", born:1960})
, (Zhangmou:Person {name:"张某", born:1967})
, (Wangmou:Person {name:"王某", born:1965})
, (Zhaomou:Person {name:"赵某", born:1952})
, (Leimou)-[:WORK {position:"CEO"}]->(Xiaomi)
, (Chenmou)-[:WORK {position:"员工"}]->(Xiaomi)
, (Mamou)-[:WORK {position:"CEO"}]->(Alibaba)
, (Zhaomou)-[:WORK {position:"员工"}]->(Alibaba)
, (Limou)-[:WORK {position:"CEO"}]->(Baidu)
, (Wangmou)-[:WORK {position:"员工"}]->(Baidu)
, (Zhangmou)-[:WORK {position:"员工"}]->(Baidu)
, (Wangmou)-[:FRIEND{weight:2}]->(Leimou)
, (Zhaomou)-[:FRIEND{weight:1}]->(Leimou)
, (Zhangmou)-[:FRIEND{weight:4}]->(Mamou)
, (Zhangmou)-[:FRIEND{weight:8}]->(Chenmou)
, (Chenmou)-[:FRIEND{weight:5}]->(Limou)
, (Mamou)-[:FRIEND{weight:10}]->(Limou)

创建完毕后,可视化效果如下 image

# 检索

  1. 查询名叫"王某"的人员
MATCH (n:Person{name:"王某"}) return n

结果:

status:OK,cursor:40,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}

2、查询1965年后出生的人员

MATCH (n:Person) where n.born > 1965 return n

结果:

status:OK,cursor:45,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}
(2)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}

3、查询所有的“朋友”关系

MATCH (n)-[r:FRIEND]->(m) return n,r,m

结果:

status:OK,cursor:38,result:6,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}         ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}    ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}     

(2)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}         ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}    ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}     

(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}         ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}    ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}     

(4)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}         ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}     ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}     

(5)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}         ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}     ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}     

(6)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}         ID:8 HEAD:9 TAIL:3 TYPE:FRIEND PROPS:{weight:1}     ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}     

可视化: image 4、查询与人员“李某”相关联的所有“一度”关系

MATCH (n:Person{name:"李某"})-[r]-(m) return n,r,m

结果:

status:OK,cursor:52,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}	
(2)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	
(3)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	

可视化: image

5、找到“张某”工作的公司以及他所有同事

MATCH (n:Person{name:"张某"})-[w1:WORK]-> (c:Company) <-[w2:WORK]-(n2) RETURN n,w1,c,w2,n2 

结果:

status:OK,cursor:93,result:2,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:6 HEAD:7 TAIL:2 TYPE:WORK PROPS:{}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}	 ID:5 HEAD:8 TAIL:2 TYPE:WORK PROPS:{position:"员工"}	 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	
(2)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:6 HEAD:7 TAIL:2 TYPE:WORK PROPS:{}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	

可视化: image

6、查询“张某”与“赵某”的最短人脉路径,通过下面结果可知张某与马某是朋友,而马某与赵某是同一个公司的同事。

MATCH path=(start :Person{name:"张某"})-[rels *<]- (end  :Person{name:"赵某"}) RETURN path 

结果:

status:OK,cursor:95,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4} ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000} ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"} ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"} ID:3 HEAD:9 TAIL:1 TYPE:WORK PROPS:{position:"员工"}	 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}	

可视化: image

# 修改

1、为人员“张某”添加性别属性

MATCH (n :Person{name:"张某"}) set n.sex="男" return n

2、为人员“张某”修改性别属性为女

MATCH (n :Person{name:"张某"}) set n.sex="女" return n

# 删除

删除操作要注意,如果某个节点带有任何关系边,则无法直接删除,需要先删除其所有关系边后才可以删除此节点,或者我们可以用“detach delete”指令一步到位一条指令同时删除其关联的所有关系边和此节点。
1、删除张某与马某的朋友关系

MATCH (n :Person{name:"张某"})-[r:FRIEND]->(m :Person{name:"马某"}) DELETE r

2、删除人员张某节点,此命令会提示无法删除,因为张某还有两条关联关系没删除,只有用上述指令删除此节点的所有关联关系后,本指令才会运行成功

MATCH (n :Person{name:"张某"}) DELETE n

3、一次性删除人员张某节点及其关联的所有关系,此指令不会出现无法删除的情况,因为它是一条指令同时删除所有关联关系然后再删除此节点

MATCH (n :Person{name:"张某"}) DETACH DELETE n

# 总结

至此,我们就快速的上手体验了NeuroDB的一个人脉关系实例,实例的数据量非常小,但这便于我们运行和理解,实际应用中,NeuroDB支持海量数据构成的图。

# Neuro-cypher指令

Neuro-cypher是一种声明式图数据库查询语言,它具有丰富的表现力,能高效地查询和更新图数据。

# 图数据结构

图由节点和关系构成。节点可能还带有标签和属性,关系带有类型和属性。节点表达的是实体,关系连接一对节点。节点可以看作类似关系数据库中的表,但又不完全一样。节点的标签可以理解为不同的表名,属性类似关系数据库中表的列。一个节点的数据类似关系数据库中表的一行数据。拥有相同标签的节点通常具有类似的属性。

# 模式(Pattern)

我们可以通过模式将复杂的想法编码为众多节点和关系Neuro-cypher查询语言很依赖于描述模式。模式可以简单到只有一对节点以及连接这对节点的关系。例如,一个人住(LIVES_IN)在某个城市或者某个城市属于(PART_OF)某个国家。模式也可以复杂到使用多个关系来表达复杂的概念,从而可以支持各种有趣的使用场景。例如,下面的Cypher代码将两个简单的模式连接在一起:

(:Person) -[:WORK]-> (:Company)

# 描述节点

Cypher采用一对圆括号来表示节点,如:()、(foo)。下面是一些常见的节点表示法:

() --空节点
(xiaomi) --只有节点变量名的空节点
(:Company) --有节点标签定义的节点
(xiaomi:Company) --有变量名和标签定义的节点
(xiaomi:Company {name: "xiaomi"}) --有变量名、标签 和一个name属性的节点
(xiaomi:Company {name: "xiaomi", create_at: 1997}) --有变量名、标签 和两个属性的节点

# 描述关系

Cypher使用一对短横线(即--)表示一个无方向关系。有方向的关系则在其中一端加上一个箭头(即<--或-->)。方括号表达式[…]可用于添加详情。里面可以包含变量、属性和(或者)类型信息。关系的常见表达方式如下:

-->  --空关系
-[role]-> --只有一个变量名的空关系
-[:WORK]->   --带有关系类型的关系
-[role:WORK]-> --带有变量名和关系类型的关系
-[role:WORK {position: "CEO"}]-> --带有变量名、类型、一个属性的关系

# 模式语法

可以将以上节点和关系的语法组合在一起来表达模式。下面是一个简单的模式:

(leimou:Person {name:"雷某", born:1969})-[:WORK {position:"CEO"}]->
 (Xiaomi:Company {name:"小米科技有限责任公司", create_at:2010, tagline:"致力于让全球每个人都能享受科技带来的美好生活"})

# 数据类型

Cypher支持以下数据类型: 属性类型:

  • 数字(Integer)
  • 字符串(String)
  • 数字数组(Integer Array)
  • 字符串数组(String Array)

结构类型:

  • 节点(Node)
  • 关系(Relationship)
  • 路径(Path)

# MATCH指令

MATCH语句用指定的模式(Pattern)来检索数据库。它常与带有约束或者断言的WHERE语句一起使用

# 查找节点

1、查询所有节点,模式中只有一个变量其他无任何限定条件,则返回全部节点

MATCH (n) RETURN n

结果:

status:OK,cursor:18,result:10,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(2)-----------------------------------------------------------------------
 ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"}
(3)-----------------------------------------------------------------------
 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(4)-----------------------------------------------------------------------
 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}
(5)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}
(6)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(7)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}
(8)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}
(9)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}
(10)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}

2、查询带有某个标签的所有节点,在模式中节点上添加:Company 标签

MATCH (n:Company) RETURN n

结果:

status:OK,cursor:26,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(2)-----------------------------------------------------------------------
 ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"}
(3)-----------------------------------------------------------------------
 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}

3、查询id为0的节点

MATCH (n #0) RETURN n

结果:

status:OK,cursor:21,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}

# 查找关系

1、按方向查找关系,关系的方向可以通过-->或者<--来表示,如向在模式中匹配人员节点“王某”向外指出的所有关系,则如下

MATCH (:Person { name:"王某" })-->(m) return m

反之,想要匹配指向王某的所有关系,则如下

MATCH (:Person { name:"王某" })<--(m) return m

因为以上两条指令关系上无任何限定条件,所以会查出指出和指向王某的所有关系。 2、为关系添加变量,并返回关系

MATCH (:Person { name:"王某" })-[r]->() return r

结果:

status:OK,cursor:48,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}
(2)-----------------------------------------------------------------------
 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}
(3)-----------------------------------------------------------------------
 ID:6 HEAD:7 TAIL:2 TYPE:WORK PROPS:{}	

3、查找id为0的关系

match ()-[r #0]->() return r

结果:

status:OK,cursor:28,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}

4、匹配关系类型,查询所有的“朋友”关系

MATCH (n)-[r:FRIEND]->(m) return n,r,m

结果:

status:OK,cursor:38,result:6,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}         ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}    ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}     

(2)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}         ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}    ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}     

(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}         ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}    ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}     

(4)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}         ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}     ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}     

(5)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}         ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}     ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}     

(6)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}         ID:8 HEAD:9 TAIL:3 TYPE:FRIEND PROPS:{weight:1}     ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}     

5、匹配多种关系类型,查找FRIEND或WORK类型的关系

match ()-[r:FRIEND|WORK]->() return r

结果:

status:OK,cursor:37,result:13,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	
(2)-----------------------------------------------------------------------
 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	
(3)-----------------------------------------------------------------------
 ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"}	
(4)-----------------------------------------------------------------------
 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	
(5)-----------------------------------------------------------------------
 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	
(6)-----------------------------------------------------------------------
 ID:1 HEAD:6 TAIL:0 TYPE:WORK PROPS:{position:"员工"}	
(7)-----------------------------------------------------------------------
 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	
(8)-----------------------------------------------------------------------
 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	
(9)-----------------------------------------------------------------------
 ID:6 HEAD:7 TAIL:2 TYPE:WORK PROPS:{}	
(10)-----------------------------------------------------------------------
 ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}	
(11)-----------------------------------------------------------------------
 ID:5 HEAD:8 TAIL:2 TYPE:WORK PROPS:{position:"员工"}	
(12)-----------------------------------------------------------------------
 ID:8 HEAD:9 TAIL:3 TYPE:FRIEND PROPS:{}	
(13)-----------------------------------------------------------------------
 ID:3 HEAD:9 TAIL:1 TYPE:WORK PROPS:{position:"员工"}	

6、查找关系上带有属性 “position”为“CEO”的关系

match ()-[r {position:"CEO"}]->() return r

结果:

status:OK,cursor:42,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	
(2)-----------------------------------------------------------------------
 ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"}	
(3)-----------------------------------------------------------------------
 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}

7、查找多条关系组合的模式,也就是指定关系的长度,如查找两条关系与三个节点组合的模式,我们称之为长度为2的模式

match (n1)-[r1]->(n2)-[r2]->(n3) return n1,r1,n2,r2,n3

结果:

status:OK,cursor:54,result:8,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(2)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(4)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	 ID:1 HEAD:6 TAIL:0 TYPE:WORK PROPS:{position:"员工"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(5)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(6)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"}	 ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"}
(7)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	 ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}	 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}	 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(8)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}	 ID:8 HEAD:9 TAIL:3 TYPE:FRIEND PROPS:{}	 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}	 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}

# 查找路径

1、查找可变长度的路径 查找关系长度最小为2的模式,即长度大于等于2的所有关系及其首尾节点

match (n1:Person{name:"王某"})-[r*2..]->(n2) return n1,r,n2

结果

status:OK,cursor:61,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	 ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}	 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}

2、查找关系长度最大为2的模式,即长度为1和长度为2的关系及其首尾节点

match (n1:Person{name:"王某"})-[r*..2]->(n2) return n1,r,n2

结果

status:OK,cursor:61,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	 ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}	 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(2)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	 ID:5 HEAD:8 TAIL:2 TYPE:WORK PROPS:{position:"员工"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(3)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	 ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}	 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}

>

3、查找指定长度指定为3的所有关系及其首尾节点

match (n1)-[r*3..3]->(n2) return n1,r,n2

结果:

status:OK,cursor:40,result:2,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(2)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}

4、查找关系长度在2到3,并且起始节点是人员“张某”的模式

match (n1:Person{name:"张某"})-[r*2..3]->(n2) return n1,r,n2

结果:

status:OK,cursor:62,result:6,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:1 HEAD:6 TAIL:0 TYPE:WORK PROPS:{position:"员工"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(2)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"}	 ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"}
(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(4)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(5)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(6)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}

5、全部路径查询,查询两个节点间的所有路径,此操作往往返回的是数据库中所有节点关系的笛卡尔乘积基本的数据量,所以很容易因数据量过大而无法返回,请读者谨慎使用。

match (n1:Person{name:"张某"})-[*]->(n2:Person{name:"王某"}) return n1,r,n2

结果集过大这里不展示

# 最优路径查询

最优路径可以查最短路径也可以查最长路径,可以是按权值查找也可以按路径长度查找,我们只需在模式中关系描述的*后面加上小于号或大于号来代表是最短路径查找还是最长路径查找。
1、查询“张某”与“赵某”的最短人脉路径,通过下面结果可知张某与马某是朋友,而马某与赵某是同一个公司的同事,注意我们没有加箭头指向限定

MATCH path=(start :Person{name:"张某"})-[rels *<]- (end  :Person{name:"赵某"}) RETURN path 

结果:

status:OK,cursor:95,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4} ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000} ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"} ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"} ID:3 HEAD:9 TAIL:1 TYPE:WORK PROPS:{position:"员工"}	 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}	

可视化: image

2、查询“张某”与“赵某”的最长人脉路径

MATCH path=(start :Person{name:"张某"})-[rels *>]- (end  :Person{name:"赵某"}) RETURN path 

结果数据过多暂不展示

可视化: image

3、按权重查找最短路径,把路径中关系上的某个属性(应为数值型属性)作为权重累加得到整条路径的权重,以此来查找权重最小的路径,比如 用关系边上的 weight属性 查找马某与张某weight权重的最短路径

MATCH path=(start :Person{name:"马某"})-[ *<weight]- (end  :Person{name:"张某"}) RETURN path 

结果:

status:OK,cursor:97,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4.000000}	 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}

可视化: image

查找马某与张某weight权重的最长路径

MATCH path=(start :Person{name:"马某"})-[ *>weight]- (end  :Person{name:"张某"}) RETURN path

结果:

status:OK,cursor:97,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10.000000} ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000} ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5.000000} ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000} ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8.000000}	 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}

可视化:

image

# RETURN指令

RETURN指令可以按照变量名返回模式匹配到的结果,并在每条结果记录中按变量在RETURN后面的出现次序排序,不在RETURN后面的变量列表中的变量将不返回。上面语句实例中我们已经大量使用了RETURN,在这里就不再赘述 实例:

match (n1)-[r1]->(n2)-[r2]->(n3) return n1,r1,n2,r2,n3

结果:

status:OK,cursor:54,result:8,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(2)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	 ID:4 HEAD:5 TAIL:2 TYPE:WORK PROPS:{position:"CEO"}	 ID:2 LABELS:Company PROPS:{name:"百度在线网络技术有限公司",create_at:2000.000000,tagline:"是拥有强大互联网基础的领先AI公司"}
(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	 ID:11 HEAD:6 TAIL:5 TYPE:FRIEND PROPS:{weight:5}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(4)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:10 HEAD:7 TAIL:6 TYPE:FRIEND PROPS:{weight:8}	 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	 ID:1 HEAD:6 TAIL:0 TYPE:WORK PROPS:{position:"员工"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(5)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:12 HEAD:4 TAIL:5 TYPE:FRIEND PROPS:{weight:10}	 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(6)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	 ID:9 HEAD:7 TAIL:4 TYPE:FRIEND PROPS:{weight:4}	 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}	 ID:2 HEAD:4 TAIL:1 TYPE:WORK PROPS:{position:"CEO"}	 ID:1 LABELS:Company PROPS:{name:"阿里巴巴集团控股有限公司",create_at:1999.000000,tagline:"旨在构建未来的商业基础设施"}
(7)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	 ID:7 HEAD:8 TAIL:3 TYPE:FRIEND PROPS:{weight:2}	 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}	 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}
(8)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}	 ID:8 HEAD:9 TAIL:3 TYPE:FRIEND PROPS:{}	 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}	 ID:0 HEAD:3 TAIL:0 TYPE:WORK PROPS:{position:"CEO"}	 ID:0 LABELS:Company PROPS:{name:"小米科技有限责任公司",create_at:2010.000000,tagline:"致力于让全球每个人都能享受科技带来的美好生活"}

# WHERE指令

WHERE指令必须加载MATCH指令后面RETURN指令之前,用于条件过滤
1、单条件查询,如查询1965年后出生的人员

MATCH (n:Person) where n.born > 1965 return n

结果:

status:OK,cursor:45,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}
(2)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(3)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}

2、多条件组合查询,查询1965年后出生并且名字以“李”开头的人员

MATCH (n:Person) where n.born > 1965 and n.name =~ "李*" return n

结果:

status:OK,cursor:66,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}	

3、模式匹配 ,* 匹配任意多个字符,_ 匹配单个字符,\ 转义字符

  • 匹配李开头的人员,用*做模式匹配
MATCH (n:Person) where  n.name =~ "李*" return n

结果:

status:OK,cursor:66,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
  • 匹配李开头的人员,用三个_做一个汉字的模式匹配(注意:一个汉字占用三个英文空间)
MATCH (n:Person) where  n.name =~ "李___" return n

结果:

status:OK,cursor:66,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
  • / 可以对* _ / 进行转义,比如:abc/d可以匹配abcd,abc/_d可以匹配abc_d,abc//d可以匹配abc/d,下面不再用指令运行展示

# ORDER BY指令

对结果集按元素的某个属性进行排序,配合 asc 与desc 指定升序降序,order by后也可以添加多个排序项,这将实现按多个排序项依次排序

MATCH (n:Person) return n order by n.born asc

结果

status:OK,cursor:45,result:7,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}
(2)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}
(3)-----------------------------------------------------------------------
 ID:4 LABELS:Person PROPS:{name:"马某",born:1964.000000}
(4)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}
(5)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}
(6)-----------------------------------------------------------------------
 ID:5 LABELS:Person PROPS:{name:"李某",born:1968.000000}
(7)-----------------------------------------------------------------------
 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}

# SKIP指令

SKIp指令用于跳过结果集中指定个数的记录,只返回后续的

MATCH (n:Person) return n skip 5

结果

status:OK,cursor:32,result:2,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	
(2)-----------------------------------------------------------------------
 ID:9 LABELS:Person PROPS:{name:"赵某",born:1952.000000}

# LIMIT指令

LIMIT指令用于限制返回记录的个数,只返回原结果集中从开头开始指定个数的记录

MATCH (n:Person) return n limit 1

结果:

status:OK,cursor:33,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:3 LABELS:Person PROPS:{name:"雷某",born:1969.000000}	

利用SKIP指令和LIMIT指令可以实现分页功能,如每页3条记录返回第3页

MATCH (n) return n skip 6 limit 3

结果:

status:OK,cursor:33,result:3,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
 ID:6 LABELS:Person PROPS:{name:"陈某",born:1960.000000}	
(2)-----------------------------------------------------------------------
 ID:7 LABELS:Person PROPS:{name:"张某",born:1967.000000}	
(3)-----------------------------------------------------------------------
 ID:8 LABELS:Person PROPS:{name:"王某",born:1965.000000}	

# CREATE指令

CREATE指令用于根据模式表达式创建图数据,图数据也就是节点与关系的集合。模式表达式可以是单个的节点或者节点与关系的组合,但不能是单独的关系,因为不能创建没有首尾节点的“悬空”关系,上面入门实例中我们已经使用过CREATE指令
1、创建一个独立节点

CREATE (Leimou:Person {name:"张三", born:1969})

2、创建一个关系,并带有首尾节点

CREATE (:Person {name:"张三", born:1969})-[:FREND]->(:Person {name:"李四", born:1969})

3、根据一个略复杂的模式表达式创建节点关系的集合

CREATE (:Person {name:"张三", born:1969})-[:FREND]->(:Person {name:"李四", born:1969})-[:WORK]->(:Company {name:"小米科技有限责任公司", create_at:2010})

# MERGE指令

MERGE指令用于先根据模式表达式到数据库中像MATCH治理那样查找是否有匹配的数据,如果没有则像CREATE指令那样创建模式表达的数据,如果有则不做任何处理
1、如以下指令数据库不做任何处理,因为数据库已经存在模式描述的节点

MERGE (Leimou:Person {name:"雷某", born:1969})

2、以下指令数据库依然不做任何处理,因为数据库中存能匹配上的数据

MERGE (Zhaomou:Person {name:"赵某", born:1952})-[r:FRIEND]->(Leimou:Person {name:"雷某", born:1969})

3、以下指令会根据模式新建模式中描述的所有节点和关系,因为没有在数据库中匹配到符合模式的数据

MERGE (Zhaomou:Person {name:"赵某", born:1952})-[r:LOVE]->(Leimou:Person {name:"雷某", born:1969})

上面指令执行完毕后,数据库中会有两个“赵某”节点和两个“雷某”节点,但其中一对赵某雷某之间是用“LOVE”关系连接的

# DELETE指令

DELETE指令必须在MATCH指令后,用于删除MATCH到的某个数据项,数据项可以是节点也可以说是关系。注意如果要删除一个节点,但此节点还带有关联的关系,则DELETE指令会无法删除,因为不能让关系“悬空”,需要先删掉关联的关系,然后才能删除此节点

1、下面指令将提示无法删除,因为节点雷某还关联着“WORK”和“FRIEND”关系

MATCH (Leimou:Person {name:"王某"}) DELETE Leimou

结果:

status:CLIST_HAS_LINK_ERR,cursor:62,result:0,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

2、删除王某和雷某之间的FRIEND关系

MATCH (:Person {name:"王某"})-[r:FRIEND]->(:Person {name:"王某"}) DELETE r

# DETACH DELETE指令

DETACH DELETE指令与DELETE指令相似必须在MATCH指令后,用于删除MATCH到的某个数据项,但DETACH DELETE指令会先删除所有关联关系然后删除节点,DETACH DELETE指令可以一次完成这两步操作,因此DETACH DELETE指令不会出现无法删除的情况。

MATCH (Leimou:Person {name:"雷某", born:1969}) DETACH DELETE Leimou

结果:

status:OK,cursor:69,result:0,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:1,delete links:0

# SET指令

SET指令必须在MATCH指令后,用于为节点或关系设置属性,如果已经有同名属性了,则SET会覆盖原来的属性值,否则就新建此属性
1、为人员“张某”添加性别属性

MATCH (n :Person{name:"张某"}) set n.sex="男" return n

2、为人员“张某”修改性别属性为女

MATCH (n :Person{name:"张某"}) set n.sex="女" return n

3、为人员“张某”修改Person标签为Person2

MATCH (n :Person{name:"张某"}) set n:Person2 return n

# REMOVE指令

REMOVE指令必须在MATCH指令后,用于移除节点或关系上的属性
1、移除除人员“张某”的“sex”属性

MATCH (n :Person{name:"张某"}) REMOVE n.sex return n

2、移除除人员“张某”的“Person”标签

MATCH (n :Person{name:"张某"}) REMOVE n:Person return n

# CALL指令

CALL指令用于调用系统内的存储过程,每个存储过程都有自己的功能
1、db.labels()返回数据库内所有的节点标签

call db.labels()

结果:

tatus:OK,cursor:16,result:2,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
"Person"	
(2)-----------------------------------------------------------------------
"Company"

2、db.types()返回数据库内所有的关系类型

call db.types()

结果:

status:OK,cursor:15,result:2,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
"FRIEND"	
(2)-----------------------------------------------------------------------
"WORK"	

3、result.count()返回结果集个数

match (n) call result.count()

结果:

status:OK,cursor:29,result:1,add nodes:0,add links:0,modify nodes:0,modify links:0,delete nodes:0,delete links:0

(1)-----------------------------------------------------------------------
10.000000	

# LOAD CSV指令

LOAD CSV指令用于批量从csv文件导入图数据,数据源必须是UTF-8格式的.csv文件,我们可以将csv文件放到数据库根目录的“import”文件夹下,这样我们在运行load csv指令时无需写冗长的文件路径,只写文件名即可;不放到“import”文件夹则需要在指令中给出csv文件全路径
1、配合CREATE指令,从"test.csv"读取所有行,并把内行第一列作为“name”属性批量导入并创建“Person”节点

load csv from "test.csv" as line create (:Person{name:line[1]})

2、上面例子也可以换成MERGE指令

load csv from \"test.csv\" as line merge (:Person{name:line[2]})")

3、也可以同时导入创建节点标签、关系类型和属性

load csv from "test.csv" as line create (:line[0]{line[1]:line[2]})"

4、对于带有“表头(标题)”的csv文,可以用 load csv with headers 指令,并且文件名后要加上as line作为每行的变量名,这里“line”就是变量名,可以自己任意定义其他名字

load csv with headers from \"test.csv\" as line create (:line.label{name:line.name,age:line.age})

5、也可以配合MATCH指令,从数据库中整合已有数据来创建新的图数据

load csv from "test.csv" as line match (n:Person{name:line[2]}) create (n)-[:line[4]{size:line[3]}]->(:Job{name:line[5]})

# 运维管理

# SAVEDB指令

因为NeuroDB是内存级图数据库,所以所有的数据都是在内存中操作的,如果想把数据持久化保存在磁盘上形成文件,文件是/data/neuro.ndb,这样下次启动NeuroDB时会自动恢复数据。因此建议在更改数据后或者关闭NeuroDB前运行SAVEDB指令。 注意,NeuroDB在配置文件neuro.conf中如果配置的存储策略(save-strategy)为1(数据变动后自动保存),则无需手动执行SAVEDB命令,系统会在数据发生变化后自己动执行。

如果用户想要定期备份数据库,可以利用操作系统的定时任务将neuro.ndb定期复制备份到他处即可。

如果删除neuro.ndb 将导致数据被全部清空。

savedb

# CREATE DATABASE指令

NeuroDB 支持创建多个图数据库,默认启动NeuroDB会有一个名叫“default”的数据库提供给用户,如果想要新建一个数据库则用CREATE DATABASE指令,后面加上数据库命名即可

CREATE DATABASE mydatabase

# SHOW DATABASES指令

想要查看系统中有哪些数据库,则使用SHOW DATABASES指令

SHOW DATABASES

结果:

INFO:  
default
mydatabase

# USE 指令

USE 指令加上数据库名,可以切换到指定数据库,后面所有操作将在此数据库上进行

USE mydatabase

# DROP DATABASE指令

DROP DATABASE指令加上数据库名,可以删除指定数据库,为了数据安全请谨慎操作

DROP DATABASE mydatabase

# SHUTDOWN指令

SHUTDOWN 指令用于关闭服务端服务进程,在关闭前会自动执行持久化存储操作

SHUTDOWN

# 服务配置文件

在NeuroDB根目录的bin目录下有“neuro.conf”文件,其中包含了系统的一些配置信息,并且每行配置信息都有注释,用户可以根据需求自行配置

# 服务启动的端口号
port 8839
# 客户端超时注销时间(秒)
max-idletime 300
# 持久化策略 0 执行存盘命令时(默认),1 数据变动时,2 关闭数据库时 3 空闲时(无客户端连接时) 4 大于4时,定时间隔时间,单位秒
save-strategy 1
# 日志级别,取值范围为:0-5,关闭级别:OFF_LEVEL 0, 错误级别:ERROR_LEVEL 1 ,警告级别:ARNING_LEVEL 2,正常消息级别:INFO_LEVEL 3, 调试级别: DEBUG_LEVEL 4, 全部打印日志级别:CMD_lEVEL 5,高级别会同时打印低级别的日志
log-level 4
# 查询超时中断时间(秒)
query-timeout 5

# 客户端启动参数

NEURO_CLI客户端默认链接ip为127.0.0.1(本机)的8839端口,也就是NEURO_SERVER服务的默认启动端口,如果用户想要修改可以使用 ip 与 port 参数。 如要连接ip为192.168.0.1服务器上的启动端口为8888的也就是NEURO_SERVER服务
Windows 系统

NEURO_CLI.exe ip 192.168.0.1 port 8888

Linux 系统

./NEURO_CLI ip 192.168.0.1 port 8888

# 运行日志

在NeuroDB根目录的logs目录下有“neuro.log”文件,其中记录了所有运行事件、命令执行记录,我们可以根据日志查看运行记录和恢复数据,应为日志中已经按顺序记录了所有执行过的命令,所以我们依次执行完相应命令就可以恢复数据 neuro.log内容如下

1671713304:- Server start at localhost:8839
1671713304:- DB loaded from disk
1671713305:. 0 clients connected , 2041914 bytes in use
1671713310:. 0 clients connected , 2041914 bytes in use
1671713311:. Accepted 127.0.0.1:39886
1671713315:. 1 clients connected , 2042131 bytes in use
1671713320:## match (n) return n limit 5
1671713320:. 1 clients connected , 2042398 bytes in use
1671713325:. 1 clients connected , 2042398 bytes in use
1671713330:. 1 clients connected , 2042398 bytes in use

上面时间戳数字后以#开头的就是执行过的命令记录,其他为事件记录

# 各开发语言驱动

# JavaScript驱动

JavaScript驱动下载地址 (opens new window) 代码示例:

 import  NeuroDBDriver from './neurodb-driver';//引入驱动包
 //事件回调方法
 let onOpen=function(){}
 let onError=function(){}
 let onClose=function(){}
 //创建驱动对象,指向IP:"127.0.0.1",端口:8839
 let neurodbBaseAPI =  new NeuroDBDriver('127.0.0.1:8839',onOpen,null,onError,onClose);
 //执行指令并返回结果集
 let resultSet=neurodbBaseAPI.executeQuery( "CREATE (n:Person{name:\"test\"}) return n")
 //执行指令
 resultSet=neurodbBaseAPI.executeQuery( "match (n) return n")
 
 

resultSet结果集对象数据结构见驱动对象结果集ResultSet数据结构

# java驱动

java驱动下载地址 (opens new window) 代码示例:

import org.neurodb.NeuroDBDriver;//引入驱动类

class Test {
    public static void main(String[] args) {
        try {
            //创建驱动对象,指向IP:"127.0.0.1",端口:8839
            NeuroDBDriver neuroDBDriver = new NeuroDBDriver("127.0.0.1", 8839);
            //执行指令,并得到结果集对象ResultSet
            ResultSet resultSet = neuroDBDriver.executeQuery("CREATE (n:Person{name:\"test\"}) return n");
            //执行指令实例2
            resultSet = neuroDBDriver.executeQuery("match (n) return n");
            //后期不再使用则最好关闭驱动对象,如果一直要用就不要关闭
            neuroDBDriver.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

resultSet结果集对象数据结构见驱动对象结果集ResultSet数据结构

# python驱动

Python驱动下载地址 (opens new window) 代码示例:

 import NeuroDBDriver # 引入驱动模块
 # 创建驱动对象,指向IP:"127.0.0.1",端口:8839
 driver = NeuroDBDriver("127.0.0.1",8839)
 # 执行指令,并得到结果集对象ResultSet
 resultSet=driver.executeQuery("CREATE (n:Person{name:\"test\"}) return ")
 # 执行指令实例2
 resultSet=driver.executeQuery("match (n) return n")

resultSet结果集对象数据结构见驱动对象结果集ResultSet数据结构

# .Net驱动

.Net驱动下载地址 (opens new window) 代码示例:

using System;
using NeuroDB_DotNet_Driver;//引入驱动类
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建驱动对象,指向IP:"127.0.0.1",端口:8839
            NeuroDBDriver driver = new NeuroDBDriver("127.0.0.1", 8839);
            //执行指令,并得到结果集对象ResultSet
            ResultSet resultSet = driver.executeQuery("CREATE (n:Person{name:\"test\"}) return n");
            //执行指令实例2
            resultSet = driver.executeQuery("match (n) return n ");
            //后期不再使用则最好关闭驱动对象,如果一直要用就不要关闭
            driver.close();
        }
    }
}

resultSet结果集对象数据结构见驱动对象结果集ResultSet数据结构

# Go 驱动

[Go 驱动下载地址](### Dart 驱动 Go t驱动下载地址 (opens new window),由社区贡献者WZFlik (opens new window)提供 代码示例:

package tests

import (
	"fmt"
	"neurodb.org/neurodb"
	"testing"
)

func TestDriver(t *testing.T) {
	db, err := neurodb.Open("127.0.0.1", 8839)
	if err != nil {
		t.Error(err)
	}

	resultSet ,err := db.ExecuteQuery("match (n) return n")
	if err != nil {
		t.Error(err)
	}
	for resultSet.Next() {
		fmt.Println(resultSet.Record())
	}
	resultSet,err = db.ExecuteQuery("match (n)-[r]->(m) return n,r,m")

	if err != nil {
		t.Error(err)
	}
	for resultSet.Next() {
		fmt.Println(resultSet.Record())
	}

}

resultSet结果集对象数据结构见驱动对象结果集ResultSet数据结构)

# Dart 驱动

Dart驱动下载地址 (opens new window),由社区贡献者dudu-ltd (opens new window)提供 代码示例:

import 'package:neurodb_dart_driver/neurodb_dart_driver.dart';

void main() async {
  var driver = NeuroDBDriver("127.0.0.1", 8839);
  ResultSet resultSet = await driver.executeQuery("match (n) return n");
  resultSet = await driver.executeQuery("match (n)-[r]->(m) return n,r,m ");
  print("ok");
  driver.close();
}

resultSet结果集对象数据结构见驱动对象结果集ResultSet数据结构

# 驱动对象结果集ResultSet数据结构

# ResultSet 返回结果数据结构:

  • "cursor":指令解析指针(如果有语法错误则指针索引不指向最后一个字符)
  • "status": 状态"OK"为成功返回,否则提示ERROR信息,
  • "msg": "运行成功" 附属信息,
  • "results": 结果集中结果记录的个数,
  • "addNodes": 添加节点个数,
  • "addLinks": 添加关系边个数,
  • "modifyNodes": 修改节点个数,
  • "modifyLinks": 修改关系边个数,
  • "deleteNodes": 删除节点个数,
  • "deleteLinks": 删除关系边个数,
  • "recordSet":结果集

# "recordSet":结果集内数据结构:

  • "labels":结果集中所有节点的label标签集合
  • "types":结果集中所有关系边的type类型集合
  • "keyNames":结果集中所有节点、关系边的属性名集合
  • "nodes":结果集内所有节点
  • "links":结果集内所有关系边
  • "records":结果集按Return指令后变量排列顺序排列的节点、关系边、路径 组成的结果记录列表

# "node"节点数据结构

  • "id":节点id
  • "labels":节点标签数组
  • "properties":属性列表,每个属性包含属性名、属性值
  • "id":关系边id
  • "hid":头结点id
  • "tid": 尾节点id
  • "type": 关系边类型
  • "properties":属性列表,每个属性包含属性名、属性值

# ResultSet实例(以JSON展示)

{
    "cursor": 39,
    "status": "OK",
    "msg": "运行成功",
    "results": 1,
    "addNodes": 0,
    "addLinks": 0,
    "modifyNodes": 0,
    "modifyLinks": 0,
    "deleteNodes": 0,
    "deleteLinks": 0,
    "recordSet": {
        "nodes": [
            {
                "id": 19,
                "labels": [
                    "staff"
                ],
                "properties": {
                    "name": "张三",
                    "sex":"男"
                }
            },
            {
                "id": 959,
                "labels": [
                    "company"
                ],
                "properties": {
                    "name": "XX科技公司"
                }
            }
        ],
        "links": [
            {
                "id": 1216,
                "hid": 19,
                "tid": 959,
                "type": "WORK_FOR",
                "properties": {}
            }
        ],
        "records": [
            [
                {
                    "id": 19,
                    "labels": [
                        "staff"
                    ],
                    "properties": {
                        "name": "张三",
                        "sex":"男"
                    }
                },
                {
                    "id": 1216,
                    "hid": 19,
                    "tid": 959,
                    "type": "WORK_FOR",
                    "properties": {}
                },
                {
                    "id": 959,
                    "labels": [
                        "company"
                    ],
                    "properties": {
                        "name": "XX科技公司"
                    }
                }
            ]
        ],
        "labels": [
            "staff",
            "company"
        ],
        "types": [
            "WORK_FOR"
        ],
        "keyNames": [
            "name",
            "sex"
        ]
    }
}

# 内嵌式数据库软件包

# JavaScript

# java

# python

# C#

# c/c++