titan数据库索引的底层实现需不需要索引

图数据库Titan在生产环境中的使用全过程+分析
注:本文以Hbase作为backend,并以下图为例
vcD4KPGgxPjChosr9vt3Eo9DNPC9oMT4KPHA+VGl0YW7U2khiYXNl1tC1xLTmtKK94bm5PC9wPgo8dGFibGUgYm9yZGVyPQ=="1" cellspacing="0" cellpadding="0">
Table “名称:titan”
Column Family 1:e
’knows’的ID+IN+点1的ID+边8的ID
’created’的ID+OUT+点3的ID+边11的ID
’created’的ID+OUT+点5的ID+边10的ID
’name’的ID
’age’的ID
Weight=1.0
Weight=0.4(字符串?)
Weight=1.0
Name=”josh”
上面的RowKey和ColumnKey都是合成的,实际存成HBase的字符数组中,所以直接查看只能看到二进制串,必须知道相应格式才能解析出来。例如边的ColumnKey中有个表示方向的标记IN或OUT,代码中是这样的:
1、创建一个图
&pre name=&code& class=&java&&// Gremlin
conf = new BaseConfiguration();
conf.setProperty(&storage.backend&,&hbase&);
conf.setProperty(&storage.hostname&,&77.77.77.77,77.77.77.78&);
conf.setProperty(&storage.tablename&,&graph1&);
g = TitanFactory.open(conf);
上图语句创建了一个名为graph1的图,注意这里的setProperty(&storage.tablename&,&graph1&);
在cassandra里是storage.keyname。使用这种方式可以创建多个图,每个图在Hbase中对应一个大表,表名和图的名字一致。下次如果open的还是这个名字,则相当于打开已有的图,否则就是新创建一个新图。
创建图时其他属性信息参见Titan的官方文档:https://github.com/thinkaurelius/titan/wiki/Using-HBase
2、插入节点
比如,v1,属性为name=‘marko’,age=29
插入语句为
g.addVertex([name:&marko&, age:29]);
那么Titan是如何执行这条语句的呢?即如何把点v1放入到本文开头描述的hbase的数据模型中呢?
首先Titan需要生成v1的ID,即rowkey。(如何生成呢:VertexIDAssigner负责分配,IDAuthority做一致性检查返回一个可以分配的ID block, IDPlacementStrategy处理ID分配策略,
IDManager根据结点类型添加不同的位标记。不同的Titan Instance会从backend里读出数据确保全局ID)。下图是rowkey的结构。
接下来,Titan把v1的各个属性放到名称为e的column family中,这里v1的属性为name和age,对应的columnkey为name的ID和age的ID,然后把对应的值填入到value中,即name=marko和age=32。
如果对name建了索引怎么办呢?如何插入索引?
现在,如果想再插入一条边:
g.addEdge(g.v(1),g.v(4),&created&,[weight:23]);
Titan是如何把这条边放入到hbase的数据模型中的呢?
首先从图中读取ID为1和ID为4的两个结点,接下来就是对Rowkey为1和4的两个行进行写入操作。在HBase的大表中专门有一行保存了边和点的属性名和id的对应关系。如果图g中已经有了Label为“created”的边,就在该行中找到该Label的ID。否则新建一个新的ID和Label的对应关系表示“created”的ID,并保存在该行中。
在1所在的行中建立一个新的Column,Column名字是一个混合的二进制字段,其中包含了“created”的ID,边的方向(out),vertex-centric indices排序用的sort key(本例为空),相邻的邻接点的ID差值(4-1的前一个邻接点的ID)和这条边自身的独有ID。这个Column的Value则是混合了Label的signature(本例为空)和所有Property(weight=23)的另一个二进制字段。
在4所在的行中建立了另一个相对应的Column,保存了4的入边。
3、存储一个图
Titan是以事务为基础的,因此没一步操作后都会默认commit,所以不用显式的调用语句进行图的存储。
4、根据属性查询节点
假设查询条件是age&10并且name=marko的节点:
g.V.has(“age”, GREATER_THAN, 10).has(“name”, “marko”)
当用户调用hasNext时,titan根据对应的索引找到其rowKey位置,在用户调用next时输出
5、遍历查询
查询上图中,v1出度边为know的邻居中,age&10的节点,查询语句为g.v(1).out('know').has(age,gt,10);
查询过程在另一篇博文中已经阐述,这里要说明的是对于边属性的过滤是如何进行的。
因为一条边可以有多个属性,以key-value串的形式存储在每个column的value中,过滤的时候以解析key-value字符串的形式进行。【专家专栏】郑志彬 | 基于Aerospike实现一个分布式图数据库(上)
去年开始做知识图谱,从网站抓取到的数据经过清洗、抽取、消歧、挖掘等最后得到的图谱,需要以在线的形式提供给用户使用,这就需要一个图数据库了。为了避免重复造轮子,我们调研了很多开源的图数据库,像neo4j, Titan, OrientDB,Graph Engine(@Microsoft), Cayley, ArangoDB, 等等。
遗憾的是这块不像RMDB,并没有一个winer,各有优缺点。本来想用Titan的,但是发现Titan的性能实在太差,而且更重要的是,代码非常复杂,不利于维护和扩展。最后我们觉得自己开发一个。但是我们并不打算从零开始构建一个图存储,而是借鉴了Titan的思想,做一个粘合层,底层的分布式存储和索引这块交给成熟的分布式NoSQL处理,这里我们选了Aerospike。
经过一两个月的开发,终于在最近完成第一版的功能。这里简单介绍一下我们的GraphDB。
图模型——Label Property Graph Model
用于表示实体(Entity)
有一个稳定的唯一的id
可以并且一般有一个label,表示实体类型,如Person,Product, etc.
Vertex: id -& label, property*
其中lable决定该实体的schema,如Person, Product, etc. Schema对于在线系统只作为接口文档,存储是schema-less。
用于表示关系(Relationship)
SPO三元组,附加可选的k-v属性对
Edge: (from_id, label, to_id) -& property*
其中label是边的类型,起到labeled edge的作用
关系具有双向性,可以根据这个同时建立反向关系,如:妻子 &=& 丈夫,兄弟 &=& 兄弟
关系可以由 (from_id, label, to_id) 唯一确定,关系id由这个生成
Lists of any other type of value
自定义类型(Json中的Map)
属性,k-v键值对
Property: key -& value
key永远是string类型,value可以是:
用于对节点和边进行归类
vertex label: neo4j的node可以有0个或者多个lable;titan则是0个或者1个,如果没有指定,会使用默认的label。出于性能考虑,GDB要求必须提供一个label。
属性理论上来说是可以有一些附加元信息的,如置信度,作者,来源等;Titan的Property of Property能够很好的支持这个功能;但是考虑到复杂性和需求的特殊性,这里不考虑。
这里不强制要求weighted edge,如果要表示关系的强弱程度(Weight of Edge),可以在边的properties中增加weight属性,可以用于关系检索时候的排序和截断。
关系也可能有别名,如: 妻子==老婆==夫人,由上层进行归一或者业务存储一个alias的property实现,GDB不处理这个。
1、Graph接口
1、创建Graph(因为Aerospike现在不支持动态删除namespace,先不支持):
2、加载已经存在的Graph:
3、删除Graph(因为Aerospike现在不支持动态删除namespace,先不支持):
4、清空数据:
目前只有一个实现,就是基于Aerospike实现的AerospikeGraph。
Graph暂时只有一个GraphName,后面应该是有一个配置信息的,对应Aerospike的Namespace配置persistence、replication-factor等
因为Aerospike暂时(&=3.12版本)不支持动态创建和删除namespace,所以我们这里也先不支持动态创建和删除Graph [TODO]
2、索引接口
1、创建索引
目前支持精确匹配和范围查询
支持嵌套属性索引,需要用attribute path指定,如name/last
支持数组类型的索引,如tags检索就是最常见的需求
后续会支持Geo类型索引
后续会支持全文检索
2、删除索引:
3、重建索引(会对数据进行一次扫描以建立索引)
3、实体接口
1、添加实体:
2、更新实体(允许局部更新,删除某个属性请将其value设置为null):
3、删除实体(同时删除顶点关联的边):
4、关系接口
1、添加关系:
2、更新关系(支持部分更新):
3、删除关系:
1、根据ID获取顶点和边
2、图遍历:提供Gremlin图检索查询语言
其中Query定义如下:
目前只在java client提供类似于Gremlin的DSL查询语法。没有多语言SDK,也没有提供灵活的字符串查询语句,如Gremlin。这部分涉及到语法解析,实现起来比较复杂,在我们后面的功能排期中。现阶段非java业务接入,可以考虑提供python SDK,或者提供定制的HTTP API(需要开发)。
想要get更多相关例子?请待明日分享~
华南理工大学计算机科学与技术(双语班)。先后在BAT从事过电子商务、开放平台、移动浏览器、搜索广告后台和大数据人工智能等相关开发和架构。擅长各种业务形态的业务架构、平台化以及各种业务解决方案。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)TITAN vi-pro variable 索引实心硬质合金立铣刀,常规长度22.86 cm ,4长笛-亚马逊中国
目前无货,
欢迎选购其他类似产品。
加入心愿单
无法加入到心愿单。请重试。
TITAN vi-pro variable 索引实心硬质合金立铣刀,常规长度22.86&cm ,4长笛
页面含机器翻译,中文仅供参考,以原文为准
天天低价·正品质优
广告
欢迎选购其他类似产品。
优质 sub-microgram 高性能可变指数整体硬质合金
可以在 SFM 和较重的芯片高负荷
前沿提供增强的奇异缓解 Edge 力量
日10:00:00至日23:59:59,满199元减100元,阅读台灯,LED照明,工具套盒,电工胶带,口罩劳保用品等均有参加,立刻点击查看!
20.3 x 10.2 x 10.2 cm
发货重量: 454 g
ASIN: B00P2CCZ2W
5 星 (0%)0%4 星4 星 (0%)0%3 星3 星 (0%)0%2 星2 星 (0%)0%1 星1 星 (0%)0%与其他买家分享您的想法
查看产品详情页面完毕后,在此处了解返回您感兴趣的页面的方式。
查看产品详情页面完毕后,在此处了解返回您感兴趣的页面的方式。

我要回帖

更多关于 titan 索引 的文章

 

随机推荐