试一试图数据库cayley

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 这是谷歌的一个开源免费的图数据库。是用Go语言写的。支持多种存储后端。 之所以要试这个,是因为它能够水平可扩展,就是说它支持分片。backend配置成分布式的存储系统就可以了。

这是谷歌的一个开源免费的图数据库。是用Go语言写的。支持多种存储后端。
之所以要试这个,是因为它能够水平可扩展,就是说它支持分片。backend配置成分布式的存储系统就可以了。我选择mongodb。
由于网络的原因,我只能离线安装了。需要安装这三个东西:Golang, Mongo, Cayley。

1.下载go。go1.8.linux-amd64.tar.gz
2.下载mongo mongodb社区版
3.下载cayley cayley_v0.6.1_linux_amd64.tar.gz

安装go:

解压tar.gz文件后,打开doc目录下的install.html, 里面有安装教程:

tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
source /etc/profile

然后下面有 Test your installation。
运行那个小程序之前要先设置GOPATH. 根据提示“How to Write Go Code ”,打开code.html。
里面提到可以运行下面这个指令查看默认的路径。

go env GOPATH 

默认路径是~/go。 这个路径我挺满意的就不改它了。 这个路径就是go的workspace所在的地方。 如果你要改这个路径就要按文档里说的将GOPATH加入到环境变量里。
如果你愿意可以按照文档里说的,弄一个hello world的程序跑一下。

安装mongodb:

解压完之后,在某个目录下新建一个配置文件。我的在/home/ubt1604/mongodb/mongodb.conf
主要就是配置logpath和dbpath这两个路径。其他都默认就OK,内容如下:

#日志文件位置
logpath=/home/ubt1604/mongodb/log/mongodb.log

# 以追加方式写入日志
logappend=true

# 是否以守护进程方式运行
fork=true

# 默认27017
#port = 27017

# 数据库文件位置
dbpath=/home/ubt1604/mongodb/data/db

# 启用定期记录CPU利用率和 I/O 等待
#cpu = true

# 是否以安全认证方式运行,默认是不认证的非安全方式
#noauth = true
#auth = true

# 详细记录输出
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)用于开发驱动程序时验证客户端请求
#objcheck = true

# Enable db quota management
# 启用数据库配额管理
#quota = true
# 设置oplog记录等级
# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog=0

# Diagnostic/debugging option 动态调试项
#nocursors = true

# Ignore query hints 忽略查询提示
#nohints = true
# 禁用http界面,默认为localhost:28017
#nohttpinterface = true

# 关闭服务器端脚本,这将极大的限制功能
# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true
# 关闭扫描表,任何查询将会是扫描失败
# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true
# 关闭数据文件预分配
# Disable data file preallocation.
#noprealloc = true
# 为新数据库指定.ns文件的大小,单位:MB
# Specify .ns file size for new databases.
# nssize =

# Replication Options 复制选项
# in replicated mongo databases, specify the replica set name here
#replSet=setname
# maximum size in megabytes for replication operation log
#oplogSize=1024
# path to a key file storing authentication info for connections
# between replica set members
#指定存储身份验证信息的密钥文件的路径
#keyFile=/path/to/keyfile

启动mongodb:

./bin/mongod -f /home/ubt1604/mongodb/mongodb.conf

关闭mongodb

./bin/mongod --shutdown -f /home/ubt1604/mongodb/mongodb.conf

安装Cayley:

解压完之后打开docs目录下的Quickstart-As-Application.md,最好用markdown工具打开一下,看的清楚一些。多看几遍,你会发现那个init根本用不上。

复制一份cayley.cfg.example,改名为cayley.cfg.overview,内容如下:

{
"database": "mongo",
"db_path": "ubuntu:27017",
"read_only": false
}

db_path是设置backend的。我们用mongodb作为backend。注意ubuntu是mongodb所在的 主机名,不是IP。
把已有的数据加载到库里:


./cayley load --config=cayley.cfg.overview --quads=data/testdata.nq --alsologtostderr
./cayley load --config=cayley.cfg.overview --quads=data/30kmoviedata.nq.gz --alsologtostderr

如果你之前已经执行过一次了,可以在命令最后加上一个 -ignoredup。

启动cayley:

./cayley http --config=cayley.cfg.overview --host=0.0.0.0

–host=0.0.0.0是说外部机器都可以访问到cayley。
启动好了之后,在浏览器里访问 http://localhost:64210/
在输入框输入

graph.Vertex("<dani>").All(),然后点击Query,就看到如下结果:
这里写图片描述

再输入graph.Vertex("<dani>").Out("<follows>").All()

这里写图片描述

语言选择Gizmo,输入g.V("<dani>").Tag("source").Out("<follows>").Tag("target").All()
这里写图片描述

根据官方的说法,Gizmo - a JavaScript, with a Gremlin-inspired* graph object.
就是说如果使用Quickstart-As-Application.md里给的JavaScript代码,webUI上语言就要选择Gizmo。

如何插入节点?

这可有点难为我了。Cayley用了一个叫做N-quad的东西,The N-Quads format is an extension of the N-Triples, the main distinction is that N-Quads allows encoding multiple graphs.这玩意我也不清楚,在webui上选择Write,输入4个字符串也能插入两个节点,但是我检索关系的时候却怎么查不出来。看来是我对这四个参数理解不够透彻吧。cayley的文档实在太少了,连个详细的tutorial都没有。好在我找到了这篇文章。Google Cayley graph database tutorial - family tree

跟文档一样,搞一个.nq的文件,然后导进去。
在data下新建一个familytree.nq。内容如下:

"john" "name" "John Smith" .
"mary" "name" "Mary Smith" .
"brian" "name" "Brian Smith" .
"susan" "name" "Susan Smith" .
"david" "name" "David Smith" .
"jennifer" "name" "Jennifer Smith" .
"lisa" "name" "Lisa Smith" .
"michelle" "name" "Michelle Johnson" .
"kevin" "name" "Kevin Smith" .
"elizabeth" "name" "Elizabeth Smith" .
"john" "spouse" "mary" .
"john" "brother" "brian" .
"brian" "spouse" "susan" .
"john" "child" "david" .
"john" "child" "jennifer" .
"mary" "child" "david" .
"mary" "child" "jennifer" .
"david" "spouse" "lisa" .
"lisa" "brother" "michelle" .
"david" "child" "kevin" .
"david" "child" "elizabeth" .
"lisa" "child" "kevin" .
"lisa" "child" "elizabeth" .

然后
./cayley load --config=cayley.cfg.overview --quads=data/familytree.nq --alsologtostderr

再次启动cayley

./cayley http --config=cayley.cfg.overview --host=0.0.0.0

最后在webui里选择Visualize,语言选择Gizmo,输入如下查询语句就可以看到全家福了

graph.V("john").Save('name', 'source').As('source').Out(['child', 'brother', 'spouse'], 'relation').Save('name', 'target').As('target' ).ForEach(function(d) {
    g.Emit(d);

    g.V(d.id).Save('name', 'source').As('source').Out(['child', 'brother', 'spouse'], 'relation').Save('name', 'target').As('target').ForEach(function(d2) {
        g.Emit(d2);

        g.V(d2.id).Save('name', 'source').As('source').Out(['child', 'brother', 'spouse'], 'relation').Save('name', 'target').As('target').ForEach(function(d3) {
            g.Emit(d3);
        } );
    } );
} );

这里写图片描述

文章里有几个demo,我查出来的结果跟他的不一样。可能是版本不同吧。
cayley环境是我在虚拟机里做的。检索的时候有卡住的情况。不知道是cayley不稳定还是虚拟机本来就卡。总之就是有点问题。如果你们也遇到这种情况请让我知道。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
存储 NoSQL 关系型数据库
MongoDB保姆级指南(上):七万字从零到进阶,助你掌握又一款强大的NoSQL!
MongoDB是数据库家族中的一员,是一款专为扩展性、高性能和高可用而设计的数据库,它可以从单节点部署扩展到大型、复杂的多数据中心架构,也能提供高性能的数据读写操作;而且提供了数据复制、无感知的故障自动选主等功能,从而实现数据节点高可用。
|
5月前
|
NoSQL 数据可视化 Docker
这是一份简单到没朋友的上手图数据库的图文教程
本文是一份极度友好,你即便只会一个开机操作、不懂任何数据库的人,也能通过学习本文查询到你想要的图关系。
355 0
|
人工智能 算法 Cloud Native
向量数据库小白必关注的“扫盲贴”来啦
自从ChatGPT问世以来,大语言模型受到广泛关注。但大模型更新频率低且不擅长垂直领域知识,向量数据库恰好可以与之互补,通过Retrieval Plugin为大模型和企业私有数据构建了一座桥梁,成为数据面向大模型的切入口。不过,你真的了解向量吗?什么又是向量数据库呢?向量检索的原理又是什么呢?向量爱好者们速速上车,跟着小编一起开启“向量探索之旅”吧!
3635 4
向量数据库小白必关注的“扫盲贴”来啦
腾讯云大神亲码“redis深度笔记”,不讲一句废话,全是精华
作为这个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis,像亚马逊、谷歌、阿里、腾讯都要使用,可见精通Redis使用真的很有必要。 所以,今天则分享出腾讯云大神亲自码出的“redis深度笔记”,笔记内容没有讲一句废话,全篇看下来都是精华
|
SQL 存储 Oracle
yyds,SQL基础教程,进阶必须(建议收藏!) 上
yyds,SQL基础教程,进阶必须(建议收藏!) 上
145 0
yyds,SQL基础教程,进阶必须(建议收藏!)   上
|
SQL
yyds,SQL基础教程,进阶必须(建议收藏!) 中
yyds,SQL基础教程,进阶必须(建议收藏!) 中
116 0
yyds,SQL基础教程,进阶必须(建议收藏!) 中
|
存储 NoSQL OLAP
CMU 15-445 数据库课程第四课文字版 - 存储2(下)
CMU 15-445 数据库课程第四课文字版 - 存储2(下)
CMU 15-445 数据库课程第四课文字版 - 存储2(下)
|
存储 SQL 关系型数据库
CMU 15-445 数据库课程第四课文字版 - 存储2(上)
CMU 15-445 数据库课程第四课文字版 - 存储2(上)
CMU 15-445 数据库课程第四课文字版 - 存储2(上)
|
存储 关系型数据库 MySQL
CMU 15-445 数据库课程第四课文字版 - 存储2(中)
CMU 15-445 数据库课程第四课文字版 - 存储2(中)
CMU 15-445 数据库课程第四课文字版 - 存储2(中)
|
SQL 存储 运维
精选Hive高频面试题11道,附答案详细解析(好文收藏)(一)
精选Hive高频面试题11道,附答案详细解析
666 0
精选Hive高频面试题11道,附答案详细解析(好文收藏)(一)