试一试图数据库cayley

这是谷歌的一个开源免费的图数据库。是用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不稳定还是虚拟机本来就卡。总之就是有点问题。如果你们也遇到这种情况请让我知道。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值