Redis的安装与使用

Linux安装

1、下载安装包 redis-6.0.8.tar.gz

2、解压Redis的安装包到/opt

3、安装gcc-c++环境

4、将redis配置文件复制到/usr/local/bin路径下

5、修改redis.conf配置文件,将redis改为默认后台启动

8、启动Redis服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-647VFtbK-1609425621737)(D:\firefoxdowload\图片\image-20201124145057005.png)]

9、使用redis-cli进行连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qdTEaxx-1609425621739)(D:\firefoxdowload\图片\image-20201124145223047.png)]

10、查看redis进程是否开启

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uolGg4vE-1609425621740)(D:\firefoxdowload\图片\image-20201124145324556.png)]

11、关闭redis服务 shutdown

Redis的使用

基本使用

#查看所有key
127.0.0.1:6379> keys *
1) "myhash:{tag}"
2) "mylist:{tag}"
3) "counter:{tag}:__rand_int__"
4) "key:{tag}:__rand_int__"
#设置key值
127.0.0.1:6379> set name wanggon
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> keys *
1) "myhash:{tag}"
2) "mylist:{tag}"
3) "counter:{tag}:__rand_int__"
4) "name"
5) "key:{tag}:__rand_int__"
6) "age"
#判断当前key值是否存在
127.0.0.1:6379> exists name age
(integer) 2
127.0.0.1:6379> exists grade
(integer) 0
#移除当前的key
127.0.0.1:6379> move age 1
(integer) 1
#设置key的过期时间
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 7
127.0.0.1:6379> ttl name
(integer) 5
127.0.0.1:6379> ttl name
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2

String(字符串)

127.0.0.1:6379> keys *
1) "myhash:{tag}"
2) "mylist:{tag}"
3) "counter:{tag}:__rand_int__"
4) "key1"
5) "name"
6) "key:{tag}:__rand_int__"
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> append key1 hello #追加字符串
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 #获取字符串的长度
(integer) 7
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> incr views #自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> decr views #自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> incrby views 5 #增加指定键的数值,步长为5
(integer) 5
127.0.0.1:6379> decrby views 5 #减小指定键的值,步长为5
(integer) 0
127.0.0.1:6379> getrange key1 0 3 #截取字符串
"v1he"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同时设置多个键值对
OK
127.0.0.1:6379> mget k1 k2 k3 #同时获得多个键的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> getset name lisi #查看一个键,并设置为新值
"wanggon"
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> setex k4 30 v4 #创建指定键并设置过期时间
127.0.0.1:6379>setnx mykey redis #不存在则设置

List列表

lpush 表头加入

rpush 尾部加入

lpop 表头弹出

rpop 表为弹出

lrange 查看指定区间

lindex 查看某个元素

lrem 移除

llen 获取列表长度

lset 更新列表

ltrim 截断列表

127.0.0.1:6379> lpush list one #将一个值或多个值插入到列表头部
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #查看列表指定区间的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 2
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list end1 #列表尾部插入
(integer) 4
127.0.0.1:6379> rpush list end2
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "end1"
5) "end2"

127.0.0.1:6379> lpop list #列表头部元素弹出
"three"
127.0.0.1:6379> rpop list #列表尾部元素弹出
"end2"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "end1"

127.0.0.1:6379> lindex list 0 //查看列表指定位置的值
"two"
127.0.0.1:6379> lindex list -1
"end1"
127.0.0.1:6379> llen list //查看列表长度
(integer) 3
127.0.0.1:6379> lrem list 1 one //移除列表指定数量的值
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "end1"
127.0.0.1:6379> ltrim list 0 0 //截断原来的列表为新列表
OK
127.0.0.1:6379> lrange list 0 -1
1) "two"
127.0.0.1:6379> lset list 0 2 //修改列表指定下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "2"

Set集合(无序不重复)

sadd 添加

smembers 查看集合所有元素

scard 查看集合元素个数

srem 移除

srandmember 随机选出一个元素

spop 随机删除一个元素

smove 移动元素

sdiiff 差集

sinter 交集

sunion 并集

127.0.0.1:6379> sadd set m1 m2 m3 m4
(integer) 4
127.0.0.1:6379> smembers set
1) "m1"
2) "m4"
3) "m3"
4) "m2"
127.0.0.1:6379> scard set
(integer) 4
127.0.0.1:6379> srem set m1
(integer) 1
127.0.0.1:6379> SMEMBERS set
1) "m4"
2) "m3"
3) "m2"
127.0.0.1:6379> SRANDMEMBER set 2
1) "m4"
2) "m3"
127.0.0.1:6379> SMEMBERS set
1) "m4"
2) "m3"
3) "m2"
127.0.0.1:6379> sadd set2 m1 m2 m5
(integer) 3
127.0.0.1:6379> sdiff set set2
1) "m4"
2) "m3"
127.0.0.1:6379> sinter set set2
1) "m2"
127.0.0.1:6379> sunion set set2
1) "m4"
2) "m2"
3) "m3"
4) "m1"
5) "m5"

Hash(哈希)

Map集合,key-map

hset 添加键值对

hget 获取值

hmset 添加多个键值对

hget 获取多个键的值

hgetall 获取所有键值对

hdel 删除

hexists 判断存在

hkeys 列出所有键

hvals 列出所有值

hincrby 自增

hdecrby 自减

hsetnx 不存在时创建

127.0.0.1:6379> hset student name wanggon age 12
(integer) 2
127.0.0.1:6379> hset student name lisi age 20
(integer) 0
127.0.0.1:6379> hgetall student
1) "name"
2) "lisi"
3) "age"
4) "20"
127.0.0.1:6379> hdel student age
(integer) 1
127.0.0.1:6379> hgetall student
1) "name"
2) "lisi"
127.0.0.1:6379> hexists student age
(integer) 0
127.0.0.1:6379> hexists student name
(integer) 1
127.0.0.1:6379> hkeys student
1) "name"
127.0.0.1:6379> hvals student
1) "lisi"
127.0.0.1:6379>

Zset(有序集合)

在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1

zadd 添加

zrange 查看

zrangebyscore 查看指定score区间的值

zrevrange 从大到小排序显示

zcard 获取集合元素个数

zrem 移除

zcount 获取集合指定区间成员个数

127.0.0.1:6379> zadd key1 20 v1 30 v2 50 v3 12 v4
(integer) 4
127.0.0.1:6379> zrange key1 0 100
1) "v4"
2) "v1"
3) "v2"
4) "v3"
127.0.0.1:6379> zcard key1
(integer) 4
127.0.0.1:6379> zrange key 0 2
(empty array)
127.0.0.1:6379> zrange key1 0 2 withscores
1) "v4"
2) "12"
3) "v1"
4) "20"
5) "v2"
6) "30"
127.0.0.1:6379> zrangebyscore key1 -inf +inf 
1) "v4"
2) "v1"
3) "v2"
4) "v3"
127.0.0.1:6379> zrem key1 v2
(integer) 1
127.0.0.1:6379> zcard key1
(integer) 3
127.0.0.1:6379> zcount key1 0 1
(integer) 0
127.0.0.1:6379>

mongodb的安装与使用

mongodb安装

1、到官网下载压缩包mongod-linux-x86_64-4.0.10.tgz

2、上传压缩包到linux中并解压到/usr/local/mongodb下

3、新建存放存储日志和数据的目录

4、新建并修改配置文件

配置文件内容如下:

systemLog:

#MongoDB发送所有日志输出的目标指定为文件

#The path of the log file to which mongod or mongos should send all diagnostic logging information

destination: file

#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径

path: “/mongodb/single/log/mongod.log”

#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。

logAppend: true

storage:

#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。

#The directory where the mongod instance stores its data.Default Value is "/data/db".

dbPath: “/mongodb/single/data/db”

journal:

#启用或禁用持久性日志以确保数据文件保持有效和可恢复。

enabled: true processManagement:

#启用在后台运行mongos或mongod进程的守护进程模式。

fork: true

net:

#服务实例绑定的IP,默认是localhost

bindIp: localhost,192.168.0.2

#bindIp

#绑定的端口,默认是27017

port: 27017

5、启动mongoDB服务

/usr/local/mongodb/bin/mongod -f /mongodb/single/mongod.conf

mongodb的使用

1、数据库操作

选择和创建数据库 use 数据库名称 (如果不存在则自动创建)

查看所有数据库 show dbs

查看当前正在使用的数据库 db

数据库的删除 db.dropDatabase()

2、集合操作

集合的创建 db.createCollection(name)

查看当前库的表 show collections

集合的删除 db.collection.drop()或db.集合.drop()

3、文档操作CRUD

文档(document)的数据结构和JSON基本一样

文档的插入
  1. 单个文档的插入 使用insert()或save()方法向集合中插入文档
    db.collection.insert(
    {
    writeConcern:
    ordered:
    })
  2. 批量插入
    db.collection.insertMany(
    [,,…]
    {
    writeConcern:
    ordered:
    })
文档的查询

db.collection.find({},{})

db.collection.findOne()

文档更新

db.collection.update(query,update,options)

query 更新的选择条件

update 要应用的修改

  1. 覆盖修改
    db.comment.update({_id:“1”},{likenum:NumberInt(1001)})
  2. 局部修改
    db.comment.update({_id:“2”},{$set:{likenum:NumberInt(889)}})
  3. 批量修改
    db.comment.update({userid:“1003”},{$set:{nickname:“凯撒大帝”}},{multi:true})
  4. 列值增长修改
    db.comment.update({_id:“3”},{$inc:{likenum:NumberInt(1)}})
删除文档

db.collection.remove({条件})

文档的分页查询
  1. 统计查询,返回在指定查询条件的文档数量
    db.collection.count(query,option)
  2. 分页列表查询,使用limit()读取指定数量的数据,使用skip()跳过指定数量的数据
    db.collection.find().limit(3)
    db.comment.find().skip(3)
  3. 排序查询,sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用 于降序排列。
    db.collection.find().sort({key:1})
文档的更多查询
  1. 正则的复杂条件查询
    MongoDB的模糊查询是通过正则表达式的方式实现的。
    db.collection.find({field:/正则表达式/}) 或
    db.集合.find({字段:/正则表达式/})
  2. 比较查询
db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
  1. 包含查询
    db.comment.find({userid:{$nin:[“1003”,“1004”]}})
    db.comment.find({userid:{$in:[“1003”,“1004”]}})
  2. 条件连接查询
    我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相 当于SQL的and) 格式为:
    $and:[ { },{ },{ } ]

Neo4j的使用

Neo4j的使用

  1. 首先,我们删除数据库中以往的图,确保一个空白的环境进行操作:
MATCH (n) DETACH DELETE n

这里,MATCH匹配操作,而小括号()代表一个节点node(可理解为括号类似一个圆形),括号里面的n为标识符

  1. 创建人物节点,并分别命名:
    节点类型为Person,属性类型有name
CREATE (n:Person {name:'Sally'}) RETURN n
CREATE (n:Person {name:'Steve'}) RETURN n
CREATE (n:Person {name:'Mike'}) RETURN n
CREATE (n:Person {name:'Liz'}) RETURN n
CREATE (n:Person {name:'Shawn'}) RETURN n

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J3CJ7sM2-1609425621741)(D:\firefoxdowload\图片\image-20201130163949480.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUw8OIfH-1609425621742)(D:\firefoxdowload\图片\image-20201130163424426.png)]

  1. 创建地区节点
    节点类型为Location,属性包括city和state
CREATE (n:Location {city:'Miami', state:'FL'})
CREATE (n:Location {city:'Boston', state:'MA'})
CREATE (n:Location {city:'Lynn', state:'MA'})
CREATE (n:Location {city:'Portland', state:'ME'})
CREATE (n:Location {city:'San Francisco', state:'CA'})

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcGgx5Me-1609425621743)(D:\firefoxdowload\图片\image-20201130163917224.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PzIkjHKO-1609425621745)(D:\firefoxdowload\图片\image-20201130163516580.png)]

  1. 创建人物之间的关系
MATCH (a:Person {name:'Liz'}),(b:Person {name:'Mike'}) MERGE (a)-[:FRIENDS]->(b)
MATCH (a:Person {name:'Shawn'}),(b:Person {name:'Sally'}) MERGE (a)-[:FRIENDS {since:2001}]->(b)
MATCH (a:Person {name:'Shawn'}), (b:Person {name:'John'}) MERGE (a)-[:FRIENDS {since:2012}]->(b)
MATCH (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
MATCH (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
MATCH (a:Person {name:'Liz'}), (b:Person {name:'John'}) MERGE (a)-[:MARRIED {since:1998}]->(b)
MATCH (a:Person {name:'Shawn'}), (b:Person {name:'John'}) MERGE (a)-[:FRIENDS {since:2012}]->(b)
MATCH (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
MATCH (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
MATCH (a:Person {name:'Liz'}), (b:Person {name:'John'}) MERGE (a)-[:MARRIED {since:1998}]->(b)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lu4tUjVH-1609425621745)(D:\firefoxdowload\图片\image-20201130164502907.png)]

  1. 建立人物与地点的关系
MATCH (a:Person {name:'John'}), (b:Location{city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b)
MATCH (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1981}]->(b)
MATCH (a:Person {name:'Mike'}), (b:Location {city:'San Francisco'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
MATCH (a:Person {name:'Shawn'}), (b:Location {city:'Miami'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
MATCH (a:Person {name:'Steve'}), (b:Location {city:'Lynn'}) MERGE (a)-[:BORN_IN {year:1970}]->(b)

所有关系如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Qs7QSAF-1609425621746)(D:\firefoxdowload\图片\image-20201130165334843.png)]

  1. 查询下所有在Boston出生的人物
MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cFE2HDS9-1609425621747)(D:\firefoxdowload\图片\image-20201130165459169.png)]

  1. 查询所有对外有关系的节点
MATCH (a)-->() RETURN a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEH40Pme-1609425621748)(D:\firefoxdowload\图片\image-20201130165548025.png)]

  1. 查询所有有结婚关系的节点
MATCH (n)-[:MARRIED]-() RETURN n

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFnKxKJ7-1609425621749)(D:\firefoxdowload\图片\image-20201130165725412.png)]

  1. 查找某人的朋友的朋友
MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName

返回Mike朋友的朋友如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cufltdx-1609425621749)(D:\firefoxdowload\图片\image-20201130170006278.png)]

Redis作业

1、判断

Redis事务保证原子性并且支持回滚。(错误)

解析:Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis事务支持隔离性。(正确)

解析:Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。

2、填空

Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。

RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。

3、选择

1、哨兵至少需要 3 个实例,来保证自己的健壮性©。

A.1

B.2

C.3

D.4

2、哨兵的功能有哪些?

A.集群监控

B.消息通知

C.故障转移

D.配置中心

3、lpush list a
lpush list b
rpush list c
list的元素顺序为?(A)

A.b a c

B.b c a

C.c b a

D.c a b

4、名词解释

Redis 事务

Redis事务的本质是通过MULTI、EXEC、WATCH等一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令

缓存雪崩

缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

5、问答

Redis为什么这么快?

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路 I/O 复用模型,非阻塞 IO;

6、程序

1、将给定元素a,b,c,d添加到集合character中。

SADD character a

SADD character b

SADD character c

SADD character d

2、返回集合的所有元素。

SMEMBERS character

3、检查给定元素是否存在于集合中

SISMEMBER character a

MongoDB作业

1、判断

MongoDB是关系型数据库。(错误)

解析:MongoDB是一个面向文档(document-oriented)的数据库

2、填空

切换数据库: use db_name

3、选择

1、下面哪个不属于MongoDB里的概念?(D)

A.collection

B.document

C.field

D.table

2、field相当于SQL数据库的哪个概念?(D)

A.database

B.table

C.row

D.column

4、名词解释

集合

集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表

5、问答

MongoDB 数据库的特性有哪些?

面向文档存储,基于JSON/BSON 可表示灵活的数据结构

高性能计算,提供基于内存的快速数据查询

容易扩展,利用数据分片可以支持海量数据存储

丰富的功能集,支持二级索引、强大的聚合管道功能

6、程序

1、创建一个STUDENT集合。

db.createCollection(“STUDENT”)

2、向STUDENT插入一个学生数据。

db.STUDENT.insert({name:“xiaoming”,sex:“male”})

3、将姓名为xiaoming的学生性别改为female。

db.STUDENT.update({name:“xiaoming”},{$set:{sex:female}})

Neo4j作业

1、判断

neo4j是基于Java语言编写图形数据库。(正确)

2、填空

图是一组节点和连接这些节点的关系

3、选择

1、图表的基本单位是(A)

A.节点

B.关系

C.属性

D.标签

2、SQL的约束类似于图形数据库的(B)

A.图

B.关系

C.节点

D.属性

4、名词解释

节点

节点是图表的基本单位。 它包含具有键值对的属性。

5、问答

关系的含义是什么?

连接两个节点,具有方向:单向和双向。每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点”。关系也可以包含属性作为键值对。

6、程序

1、插入节点。插入一个Person类别的节点,且这个节点有一个属性name。

CREATE (n:Person { name : ‘Andres’});

2、插入边。插入一条a到b的有向边,且边的类别为Follow

MATCH (a:Person {name:‘Liz’}),(b:Person {name:‘Mike’}) MERGE (a)-[:FRIENDS]->(b)

3、查询两个节点之间的关系。

MATCH (a:Person { name:‘Andres’ })-[r]->(b:Person { name:‘Taylor’ })

丰富的功能集,支持二级索引、强大的聚合管道功能

6、程序

1、创建一个STUDENT集合。

db.createCollection(“STUDENT”)

2、向STUDENT插入一个学生数据。

db.STUDENT.insert({name:“xiaoming”,sex:“male”})

3、将姓名为xiaoming的学生性别改为female。

db.STUDENT.update({name:“xiaoming”},{$set:{sex:female}})

Neo4j作业

1、判断

neo4j是基于Java语言编写图形数据库。(正确)

2、填空

图是一组节点和连接这些节点的关系

3、选择

1、图表的基本单位是(A)

A.节点

B.关系

C.属性

D.标签

2、SQL的约束类似于图形数据库的(B)

A.图

B.关系

C.节点

D.属性

4、名词解释

节点

节点是图表的基本单位。 它包含具有键值对的属性。

5、问答

关系的含义是什么?

连接两个节点,具有方向:单向和双向。每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点”。关系也可以包含属性作为键值对。

6、程序

1、插入节点。插入一个Person类别的节点,且这个节点有一个属性name。

CREATE (n:Person { name : ‘Andres’});

2、插入边。插入一条a到b的有向边,且边的类别为Follow

MATCH (a:Person {name:‘Liz’}),(b:Person {name:‘Mike’}) MERGE (a)-[:FRIENDS]->(b)

3、查询两个节点之间的关系。

MATCH (a:Person { name:‘Andres’ })-[r]->(b:Person { name:‘Taylor’ })
RETURN type( r);