一.安装

mkdir cayley

cd cayley

mkdir src

export GOPATH=$(pwd)

go get github.com/google/cayley

go build src/github.com/google/cayley/cayley.go

其中缺什么包下什么包,没有hg工具安装hg

修改下源码cayley.go

    switch cmd {
case "init":
db.Init(cfg, *tripleFile)
case "load":
ts, _ = db.Open(cfg)
db.Load(ts, cfg, *tripleFile)
ts.Close()
case "repl":
ts, _ = db.Open(cfg)          
db.Repl(ts, *queryLanguage, cfg)
ts.Close()
case "http":
ts, _ := db.Open(cfg)
http.Serve(ts, cfg)
ts.Close()
default:
fmt.Println("No command", cmd)
flag.Usage()
}

运行

go build $GOPATH/src/github.com/google/cayley/cayley.go && ./cayley http --port=8080 --assets=$GOPATH/src/github.com/google/cayley --dbpath=src/testdata.nt

assets 参数代表启动http server以后存放html静态资源的目录,源码里是自带的

dbpath 是数据库的一些初始化数据,必须指定,不然启动了,也没法添加数据,默认是指定为/tmp/testdb文件

在浏览器输入http://127.0.0.1:8080/如果有页面输出说明成功了

二.基本概念

testdata.nt内容如下

alice follows bob .
bob follows alice .
charlie follows bob .
dani follows charlie .
dani follows alice .
alice is cool .
bob is "not cool" .
charlie is cool .
dani is "not cool" .

内容的每行都是以空格分隔的四元组,每一行叫做一个Triple,存储多个Triple组成了TripleStore,每个Triple由四部分组成,依次对应数据每行用空格分隔的每项,分别叫Subject,Predicate,Object,Provenance。对应中文里的,Subject是中文里的主语,Predicate是中文里的谓语,Object是宾语,Provenance是来源。也就是说,每行描述了,谁怎么样了XX,或者谁是XX样的。Subject转换成有向图中的顶点,Object是出度的顶点,Predicate是路径。

cayley搭了一套图数据库的框架,官方提供了三种存储memory,leveldb,mongodb 可以切换存储引擎,只需要实现接口,就可以扩展存储方式,和mysql与innodb的关系差不多。

三.使用API

1. g.V()

取一个图中的顶点,也就是Triple中的Subject,返回一个点的对象

2. path.Out([predicatePath], [tags])

Out是取一个顶点的出度。不过,这个出度是按照谓词区分的,当Out()不传递参数的时候,是取出某个顶点不按路径区分的所有出度;当Out传递了predicatePath参数的时候,是取出某个顶点,在某个路径上的所有出度。tags 是用来存储路径的名称。例如:

我们入库的数据中以alice顶点为例,

alice follows bob
alice is cool

可以看出alice这个顶点有两个路径,分别是follows和is

(1) 查询allice的所有出度

g.V("alice").All()

(2) 查询alice的关注:

g.V("alice").Out("follows").All()

(3) 查询allice是否很cool

g.V("alice").Out("is").All() 

(4) 查询alice的关注和是否很cool

g.V("alice").Out(["follows", "is"]).All()

"result": [
{
"id": "bob"
},
{
"id": "cool"
}

(5) 虽然你可以直观的看到,alice的关注是bob,并且alice是个很酷的人,那是因为是通过字面意思,比如有些人follows为空,有些人is为空,那就没法判断返回的出度在哪个路径上,这个时候应该使用tag参数

g.V("alice").Out(["follows", "is"], "path").All()

3. path.In([predicatePath], [tags])

和Out正好相反,是求的入度。

(1) 求所有cool的人

g.V("cool").In("is").All()

(2) alice的粉丝

g.V("alice").In("follows").All()

4. path.Both([predicatePath], [tags])

In和Out的的结果并集,没有去重

5. path.Has(predicate, object)

反向查找,paredicate是路径,object是三元组中的宾语

(1) 查找alice的粉丝

g.V().Has("follows", "alice").All()

6.path.Follow(morphism)

通过管道加速

g.V().Has("name","Casablanca") .Out("/film/film/starring").Out("/film/performance/actor") .Out("name").All()

等价于

var filmToActor = g.Morphism().Out("/film/film/starring").Out("/film/performance/actor")

g.V().Has("name", "Casablanca").Follow(filmToActor).Out("name").All()

总体的查询模式就是,选顶点,选路径,ALL输出

四. Triple,基于内存的TripleStore数据结构

1.数据结构

type Triple struct {
  Subject string
  Predicate string
  Object string
  Provenance string
}

三元组,Provenance好像是类似于数据库里的分库的概念(不大确定),Triple中不同的字段,在后面叫Direction

type TripleStore struct {
  idCounter int64           //idMap的长度     
  tripleIdCounter int64        //tripleId的序列
  idMap map[string]int64       //存储三元组的 内容->tripleId 的对应关系
  revIdMap map[int64]string     //存储三元组的 tripleId->内容 的对应关系 idMap的反向映射关系
  triples []graph.Triple       //存储每条记录的关系三元组
  size int64              //triples的数量
  index TripleDirectionIndex    //triples的索引 每个idMap中的一个key有一个平衡二叉树,里面放了tripleId
}
TripleDirectionIndex是一个通过Direction作为分组的一级索引
type TripleDirectionIndex struct {
subject map[int64]*llrb.LLRB  
predicate map[int64]*llrb.LLRB
object map[int64]*llrb.LLRB
provenance map[int64]*llrb.LLRB
}

2.实例演示

数据

alice follows bob .

bob follows alice .

charlie follows bob .

建立以后的结果如下

          idMap                            revIdMap

          1 <=============> alice

          2 <=============> follows

          3 <=============> bob

          4 <=============> charlie

                  triples

      Direction  DirectionSubject  DirectionPredicate   DirectionObject

tripleId  1       alice        follows        bob

       2       bob         follows        alice

       3       charlie         follows        bob  

                  DirectionIndex

                                 1  =========>  (1)

        DirectionSubject=============>     3  =========>  (2)

                               4  =========>  (3)      

        DirectionPredicate============>     2  =========>      插入第一行时(1)    --->  插入第二行   (2)                                                                              /  

                                                            (1)

                                            

                                            -----> 插入第三行    (2)

                                                      /  \

                                                    (1)      (3)

        DirectionObject==============>   3  ============>  插入第一行 (1) ---> 插入第三行 (3)

                                                          /

                                                         (1)

                               1 =============> (2)

DirectionIndex中的1 是IdMap中的编号,(1)是triples中的tripleId

3.查询方法

看源码里把查询逻辑都写在了itorator里,各种hasA,and,or,link!@#!4。

如果查一个值的入度就是先查DirectionObject索引,查出度就查DirectionSubject索引,有路径条件就再在DirectionPredicate里做二分排除掉。

google Cayley图谱数据库初试的更多相关文章

  1. Google Cayley图数据库使用方法

    最近在用Golang做流程引擎,对于流程图的存储,我看到了Google的Cayley图数据库,感觉它可能会比较适合我的应用,于是便拿来用了用. 项目地址在这里:https://github.com/g ...

  2. Cayley图数据库的简介及使用

    图数据库   在如今数据库群雄逐鹿的时代中,非关系型数据库(NoSQL)已经占据了半壁江山,而图数据库(Graph Database)更是攻城略地,成为其中的佼佼者.   所谓图数据库,它应用图理论( ...

  3. Cayley图数据库的可视化(Visualize)

    引入   在文章Cayley图数据库的简介及使用中,我们已经了解了Cayley图数据库的安装.数据导入以及进行查询等.   Cayley图数据库是Google开发的开源图数据库,虽然功能还没有Neo4 ...

  4. Google 分布式关系型数据库 F1

    F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...

  5. nopCommerce 数据库初试化及数据操作

    系统启动时执行任务:IStartupTask,启动时执行的任务主要是数据库的初始化和加载. IStartupTask调用IEfDataProvider进行数据库的初始化. IEfDataProvide ...

  6. NopCommerce架构分析之三---数据库初试化及数据操作

    系统启动时执行任务:IStartupTask,启动时执行的任务主要是数据库的初始化和加载. IStartupTask调用IEfDataProvider进行数据库的初始化. IEfDataProvide ...

  7. Atitit 知识图谱的数据来源

    Atitit 知识图谱的数据来源   2. 知识图谱的数据来源1 a) 百科类数据2 b) 结构化数据3 c) 半结构化数据挖掘AVP (垂直站点爬虫)3 d) 通过搜索日志(query record ...

  8. 从零开始山寨Caffe·柒:KV数据库

    你说你会关系数据库?你说你会Hadoop? 忘掉它们吧,我们既不需要网络支持,也不需要复杂关系模式,只要读写够快就行.    ——论数据存储的本质 浅析数据库技术 内存数据库——STL的map容器 关 ...

  9. Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了

    作者:Glowin链接:https://zhuanlan.zhihu.com/p/22881223来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 原文地址:Google ...

随机推荐

  1. Oracle PLSQL INDEX BY Binary_Integer 测试

    [转自] http://blog.chinaunix.net/uid-14669803-id-2921539.html DECLARE TYPE t_list_1 IS TABLE OF VARCHA ...

  2. 基于pydpier爬取1药网(转载)

    1.商品爬取 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2019-02-02 08:59:40 # Project: o ...

  3. poj3190

    一.题意:有n头牛,每头牛需要占用一个时间段的时间来挤奶,且必须有机器.问最少需要多少个机器 二.思路:区间贪心.把尽量多的牛放在一个棚子里,这样就可以使得用到的棚子数最少.只要任意两头牛的挤奶时间不 ...

  4. PIXI 根据点走地图(8)

    先了解下数学公式例如: 图已知:a.b两点的坐标, c到a的距离d .求c点的坐标.   求 cy 可以根据d / a到b距离 = a到c垂直距离 / a 到 b的垂直距离.   首先求a到b的距离 ...

  5. DataGuard具体搭建环节

    在上一篇blog中,详细介绍DataGuard实现的原理,本篇介绍DataGuard的具体搭建过程. 主库打开日志,并强制force logging SQL>shutdown immediate ...

  6. 60分钟内从零起步驾驭Hive实战学习笔记(Ubuntu里安装mysql)

    本博文的主要内容是: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强烈依赖于Hive.Spark原来没有做SQL ...

  7. TOJ 2815 Connect them (kruskal+并查集)

    描述 You have n computers numbered from 1 to n and you want to connect them to make a small local area ...

  8. Unity3d Attribute 总结

    举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在Unity的Editor上进行赋值. 在Class上使用[RequireComponent]属性,就会在C ...

  9. 如何去除表单元素获得焦点时的外边框:outline (轮廓)

    我们在做制作表单页面时,经常会需要消除表单元素带来的边框,这时候我们需要用到两个属性: 1.表单元素未激活状态下的边框,不实现边框: border:none; 2.表单元素获得焦点时的轮廓,隐藏轮廓: ...

  10. 网络连接和初始HTTP请求

    浏览器检索网页,先从URL开始,使用DNS确定IP地址,再用基于TCP和HTTP协议连接到服务器,请求相关的内容,得到相应,浏览器解析并呈现到屏幕上.服务器响应后,浏览器响应不会同时全部到达,会陆续到 ...