Titan-红号楼宗谱案例
2016-07-22 10:30
225 查看
一. 简介
titan:存储,查询图形结构的数据库。分布式集群环境下,可支持数以千亿级别的点和边,同时支持上千个并发的实时的复杂图形遍历,支持ACID事务。架构:支持以下3方面的自由组合
(1)节点和边的存储:
Apache Cassandra
Apache HBase
Oracle BerkeleyDB(测试使用)
(2)图形分析组件:
Spark
Giraph
Hadoop
(3)地理,数值,全文检索支持
ElasticSearch
Solr
Lucene
二. titan-hbase-es部署范例
版本对应(1)titan:0.54-hadoop2
(2)hbase:1.1.5 (版本相对宽松)
(3)elasticsearch:1.4
(4)rexster-server:2.6
titan server部署
(1)rexster-server解压
(2)修改config/rexster.xml文件,添加如下内容
<graph> <graph-enabled>true</graph-enabled> <graph-name>titanexample</graph-name> <graph-type>com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration</graph-type> <graph-location></graph-location> <graph-read-only>false</graph-read-only> <properties> <storage.backend>hbase</storage.backend> <storage.hostname>localhost:2181,localhost:2182,localhost:2183</storage.hostname> <storage.hbase.table>facebook</storage.hbase.table> <index.search.backend>elasticsearch</index.search.backend> <index.search.elasticsearch.client-only>true</index.search.elasticsearch.client-only> <index.search.hostname>127.0.0.1</index.search.hostname> <index.search.index-name>facebook</index.search.index-name> </properties> <extensions> <allows> <allow>tp:gremlin</allow> </allows> </extensions> </graph>
(3)复制titan jar包到rexster lib
cp TITAN_HOME/lib/* REXSTER_HOME/ext/titan/
(4)删除rexster/lib下的lucene相关jar包,会与titan的引起冲突
(5)开启rexster
./bin/rexster.sh -s -c ./config/rexster.xml
(6)访问http://ip:8182/graphs/titanexample,REST
三. titan server接口
RexPro二进制协议public class TestClient { public static void main(String[] args) throws Exception { RexsterClient client = RexsterClientFactory.open("localhost", "titanexample"); List<Map<String,Object>> result; result = client.execute("aa=g.V.has('name','saturn');aa.next()"); //result = client.execute("g.getManagementSystem().get(‘cache.db-cache’)"); // result.toString(): [{name="jupiter"}] System.out.println(result); client.close(); } }
<dependency> <groupId>com.tinkerpop.rexster</groupId> <artifactId>rexster-protocol</artifactId> <version>2.6.0</version> </dependency>
thinkerpop - REST协议
四. “红楼梦宗谱”示例
编写blueprint脚本,设置schema,索引,添加将节点数据com.thinkaurelius.titan.core.schema.TitanManagement mgmt = g.getManagementSystem(); //点的属性名 com.thinkaurelius.titan.core.PropertyKey name = mgmt.makePropertyKey("name").dataType(String.class).make(); com.thinkaurelius.titan.core.PropertyKey age = mgmt.makePropertyKey("age").dataType(Integer.class).make(); // 点的标签名 mgmt.makeVertexLabel("people").make(); //该点表示人 mgmt.makeVertexLabel("hobby").make(); //该点是一个运动 // 给点的姓名年龄建索引 mgmt.buildIndex("name",Vertex.class).addKey(name).unique().buildCompositeIndex(); // "search"是配置文件中的标识符 mgmt.buildIndex("vertices",Vertex.class).addKey(age).buildMixedIndex("search"); // mixedIndex是外部索引,用es存储索引 // 边的属性 mgmt.makeEdgeLabel("father").multiplicity(com.thinkaurelius.titan.core.Multiplicity.MANY2ONE).make(); mgmt.makeEdgeLabel("mother").multiplicity(com.thinkaurelius.titan.core.Multiplicity.MANY2ONE).make(); mgmt.makeEdgeLabel("hobby").multiplicity(com.thinkaurelius.titan.core.Multiplicity.MULTI).make(); com.thinkaurelius.titan.core.PropertyKey time = mgmt.makePropertyKey("time").dataType(Integer.class).make(); com.thinkaurelius.titan.core.EdgeLabel love = mgmt.makeEdgeLabel("love").signature(time).make();//什么时候确立爱情挂席 mgmt.buildEdgeIndex(love,"lovetime", Direction.BOTH, com.thinkaurelius.titan.core.Order.DESC,time); mgmt.commit(); //插入点 com.thinkaurelius.titan.core.TitanTransaction tx = g.newTransaction(); Vertex jiazheng = tx.addVertexWithLabel("people"); // 贾政 jiazheng.setProperty("name","贾政"); jiazheng.setProperty("age",48); Vertex jiabaoyu = tx.addVertexWithLabel("people"); // 贾宝玉 jiabaoyu.setProperty("name","贾宝玉"); jiabaoyu.setProperty("age",18); Vertex wangfuren = tx.addVertexWithLabel("people"); // 王夫人 wangfuren.setProperty("name","王夫人"); wangfuren.setProperty("age",47); Vertex xuebaochai = tx.addVertexWithLabel("people"); // 薛宝钗 xuebaochai.setProperty("name","薛宝钗"); xuebaochai.setProperty("age",17); Vertex cixiu = tx.addVertexWithLabel("hobby"); cixiu.setProperty("name","刺绣"); Vertex zuoshi = tx.addVertexWithLabel("hobby"); zuoshi.setProperty("name","作诗"); //插入边 jiabaoyu.addEdge("father",jiazheng); jiabaoyu.addEdge("mother",wangfuren); ElementHelper.setProperties(jiabaoyu.addEdge("love",xuebaochai),"time",1001); // 贾宝玉爱林黛玉,"time"属性为1001 wangfuren.addEdge("hobby",cixiu); xuebaochai.addEdge("hobby",zuoshi); tx.commit();
通过RexPro协议发送脚本到服务器
public static void main(String[] args) throws Exception { RexsterClient client = RexsterClientFactory.open("localhost", "titanexample"); List<Map<String,Object>> result; BufferedReader br = new BufferedReader(new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("facebook-gremlin"))); String str=""; StringBuffer sb = new StringBuffer(); while((str = br.readLine())!=null){ sb.append(str); } System.out.println(sb.toString()); result = client.execute(sb.toString()); System.out.println(result); client.close(); }
rest api
curl -XGET http://localhost:8182/graphs/titanexample/vertices #查看所有边 curl -XGET http://localhost:8182/graphs/titanexample/edges curl -XGET http://localhost:8182/graphs/titanexample/keyindices curl -XGET http://localhost:8182/graphs/titanexample/vertices/16400/in #查询节点的入射边 curl -XPOST http://localhost:8182/graphs/titanexample/vertices/11111?name=zhangsan&age=24 #创建节点 curl -XPOST http://localhost:8182/graphs/titanexample/edges?_outV=<id>&_label=friend&_inV=2&<key>=<key'> #创建节点间的边
gremlin查询示例,查询贾宝玉的父亲
gremlin> g.V.has('name','贾宝玉').next().out('father').name ==>贾政
全文检索节点,按照es的格式封装的map
result = client.execute("g.indexQuery(\"vertices\", \"v.age:(17)\").vertices().get(0).getElement()"); for (Map<String, Object> map : result) { for (Map.Entry<String, Object> en : map.entrySet()) { System.out.print(en.getKey()+":"+en.getValue()+"\t\t"); } System.out.println(); } /** _type:vertex _properties:{name=薛宝钗, age=17} _id:16496 */
数据展现
(1)Sigma.js it's a free and open source tool for graph visualization quite nice. Linkurious is using a fork version of it as far as I know in their product.
(2)VivaGraph it's another free and open source tool for graph visualization tool - but it has a smaller community compared to SigmaJS.
(3)D3.js it's the factotum for data visualization, you can do basically every kind of visualization based on that, but the learning curve is quite steep.
(4)Gephi is another free and open source desktop solution, you have to use an external plugin with that probably but it does support most of the formats out there - graphML, CSV, Neo4J, etc...
五. 参考网站
thinkerpopgremlin与sql对比查询语法
sparql-gremlin插件
DataStax给出的图形查询语言,包括sparql,GraphQL, Cypher, Gremlin
相关文章推荐
- 回车与换行的区别
- Java序列化的机制和原理
- ( 值得收藏) liunx 命令大全
- 51nod 1138 连续整数的和
- Android中Recyclerview使用7----条目中按钮点击事件,在activity中调用(接口回调)
- 在Ubuntu 14.04上安装Caffe
- 数位dp小结
- Mybatis实现自定义的typehandler三步曲
- android点击Button,使字体变色
- 和block循环引用说再见
- adb常用命令|修改build.porp文件
- MATLAB2012a_for_win7_64
- Jsp页面中双引号问题
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
- Android利用AsyncTask异步类实现网页内容放大缩小
- 基于BootStrap 的城市三级联动。
- 自定义开关Button(一)
- 设计模式学习笔记(三):装饰者模式
- JAVA之IO
- android 5.0预制APK方法,android5.0预制apk