试一试图数据库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
目录
相关文章
|
27天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
55 3
|
27天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
64 3
|
27天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
84 2
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
261 15
|
1月前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
1月前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
68 1
|
2月前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
100 4

热门文章

最新文章