1. 概述
Cayley是Google开源的图数据库,受到Freebase和Google知识图谱(Google's Knowledge Graph)的启发,其目标是成为开发者在Linked Data和图数据(语义网络、社交网络等)的工具之一。
- 编程语言 Go
- 运行简单,只需 3 到 4 个命令
- RESTful API
- REPL(Read Eval Print Loop)
- 内建查询编辑器和可视化界面
- 支持多种查询语言
- Gizmo - a JavaScript, with a Gremlin-inspired* graph object.
- GraphQL-inspired* query language.
- (simplified) MQL, for Freebase fans
- 支持多种后端存储
- KVs: Bolt, LevelDB
- NoSQL: MongoDB
- SQL: PostgreSQL, CockroachDB, MySQL
- In-memory, ephemeral
- 模块化设计,易于扩展对新语言和新后端的支持
- 良好的测试覆盖率
- 性能好
初步性能测试表明,在普通PC硬件和硬盘上,LevelDB跑1.34亿三元组毫无问题,多跳交叉查询(比如由X和Y两位影星同时出演的电影)只需150ms。
图数据库是一种NoSQL数据库,是基于节点、边和属性的图论,适合处理大量复杂、互连接、低结构化的数据。它更擅长描述数据之间的关系,因此被大量用于社交网络、推荐系统等专注于构建关系图谱的系统。
2. 基本概念
- n-quad
quads/triples是cayley中的一行,描述了起点、关系和终点,可以想象成是两个节点用一条边连接了起来。
例如,cayley内置的测试数据data/testdata.nq内容如下:
<alice> <follows> <bob> .
<bob> <follows> <fred> .
<bob> <status> "cool_person" .
<charlie> <follows> <bob> .
<charlie> <follows> <dani> .
<dani> <follows> <bob> .
<dani> <follows> <greg> .
<dani> <status> "cool_person" .
<emily> <follows> <fred> .
<fred> <follows> <greg> .
<greg> <status> "cool_person" .
<predicates> <are> <follows> .
<predicates> <are> <status> .
<emily> <status> "smart_person" <smart_graph> .
<greg> <status> "smart_person" <smart_graph> .
每一行是一个Triple,每个Triple由四部分组成,依次对应数据用空格分隔的每项,分别叫Subject,Predicate,Object,Provenance,对应中文里的主语、谓语、宾语、来源。Subject转换成有向图中的顶点,Object是出度的顶点,Predicate是路径,Provenance是指可以在一个数据库里存多个图,用其来区分不同的图。
上述关系可以用下图来表示:
其中箭头指明了follows的关系,而#括起来的人名表示,这些人有status为cool_person or smart_person。
- triple,基于内存的TripleStore数据结构
type Triple struct {
Subject string
Predicate string
Object string
Provenance string
}
type TripleStore struct {
idCounter int64 //idMap的长度
tripleIdCounter int64 //tripleId的序列
idMap map[string]int64 //