简介
ThinkerPop是由Apache开发,面向实时事务处理(OLAP)以及批量、分析型(OLTP)的开源图计算框架。TinkerPop可以应用于不同图数据库的抽象层,避免应用程序与特定数据库高度依赖。Tinkerpop提供的通用API、Gremlin语言和工具,使开发人员可以基于不同图数据库轻松创建图形应用程序,使图数据库与图计算解耦,方便切换不同图形数据库,简化其工作。TinkerPop是不同图形数据库和不同图形处理器上的抽象层。作为抽象层,TinkerPop提供了一种避免供应商锁定特定数据库或处理器的方法。这一功能为开发人员提供了巨大的便利。另外,如果使用JanusGraph的话,也建议多了解Tinkerpop,因为JanusGraph 正是基于Tinkerpop 这个框架来开发的。Tinkerpop虽然是一个图计算框架,但是配合TinkerGraph也是可以作为图数据库使用的。

目前,图数据库市场仍处于百家争鸣的时代,各家的查询语言也不尽相同,Neo4j的Cypher、JanusGraph脱胎于Tinkerpop的Gremlin、TigerGraph的GSql等。如果说未来可能有一个标准的话,应该说Gremlin是最大的可能,截止到今天,Gremlin已经被JanusGraph、GraphDB等产品兼容。关于Tinkerpop的更多信息,可以访问其官网查看。
TinkerPop集成Neo4j
Neo4j是目前使用最广泛的图数据库,缺点就是企业版收费略贵,社区版又不支持HA。通过Tinkerpop集成Neo4j,首先可以通过gremlin来访问数据库,方便迁移。另外比较重要的一点就是Tinkerpop集成Neo4j可以支持HA。下面操作都以Tinkerpop Server 3.4.4为例,当然使用Tinkerpop Console也是可以的,不过比较简单,且使用不多,就不介绍了。
单节点配置
Tinkerpop的单节点Neo4j配置比较简单,并且这种方式用的也不多,不过可以使用Neo4j生成的db文件对接Tinkerpop。这里需要注意的是Tinkerpop 3.4.4支持的Neo4j版本依然是3.2.3(吐槽一下版本太低),官方计划是在3.5的版本中支持Neo4j 3.4。
- 安装Neo4j依赖:bin/gremlin-server.sh install org.apache.tinkerpop neo4j-gremlin 3.4.4
- 根据需要修改conf/neo4j-empty.properties文件,主要就是db目录
- 修改conf/gremlin-server-neo4j.yaml的host和port
- 启动Tinkerpop Server即可。
这里说一下启动Tinkerpop的四种方法:
- bin/gremlin-server.sh conf/gremlin-server-neo4j.yaml 前台直接启动,这也是在调试的时候最常使用的方法。
- 使用nohup结合上面命令后台启动。
- 设置GREMLIN_YAML环境变量后台启动,export GREMLIN_YAML=conf/gremlin-server-neo4j.yaml,然后使用 bin/gremlin-server.sh start 即可,系统会自动寻找GREMLIN_YAML指定的配置文件。
- 配置gremlin-server.conf文件,在bin目录下建立gremlin-server.conf文件,并在其中设置 GREMLIN_YAML的值即可,这种方法的好处就是,可以指定多个变量,例如下面的设置demo:
GREMLIN_YAML=conf/gremlin-server-neo4j.yaml JAVA_HOME=/usr/local/java JAVA_OPTIONS="-Xmx1g -Xms1g" LOG_DIR=logs/
HA配置
HA配置步骤如下:
- 安装Neo4j依赖:bin/gremlin-server.sh install org.apache.tinkerpop neo4j-gremlin 3.4.4
- 修改conf/neo4j-empty.properties文件,两台服务器的配置如下:
gremlin.graph=org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph gremlin.neo4j.directory=/tmp/neo4j gremlin.neo4j.conf.dbms.auto_index.nodes.enabled=true #gremlin.neo4j.conf.dbms.auto_index.nodes.keys= gremlin.neo4j.conf.dbms.auto_index.relationships.enabled=true #gremlin.neo4j.conf.dbms.auto_index.relationships.keys= gremlin.neo4j.conf.dbms.mode=HA gremlin.neo4j.conf.ha.server_id=1 gremlin.neo4j.conf.ha.initial_hosts=IP1:5001\,IP2:5001 gremlin.neo4j.conf.ha.host.coordination=IP1:5001 gremlin.neo4j.conf.ha.host.data=IP1:6001
gremlin.graph=org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph gremlin.neo4j.directory=/tmp/neo4j gremlin.neo4j.conf.dbms.auto_index.nodes.enabled=true #gremlin.neo4j.conf.dbms.auto_index.nodes.keys= gremlin.neo4j.conf.dbms.auto_index.relationships.enabled=true #gremlin.neo4j.conf.dbms.auto_index.relationships.keys= gremlin.neo4j.conf.dbms.mode=HA gremlin.neo4j.conf.ha.server_id=1 gremlin.neo4j.conf.ha.initial_hosts=IP1:5001\,IP2:5001 gremlin.neo4j.conf.ha.host.coordination=IP2:5001 gremlin.neo4j.conf.ha.host.data=IP2:6001
- 修改conf/gremlin-server-neo4j.yaml文件的host和port,注意两个Server的port配置相同。
- 分别启动两个Server即可。
接下来就可以通过Console访问了,修改Console下的conf/remote.yaml文件,设置 hosts: [IP1,IP2],port为Server配置端口即可。
如果是应用程序访问,则需要去除 serializeResultToString 属性。即直接修改 remote-objects.yaml 文件即可。连接程序如下:
GraphTraversalSource g = traversal().withRemote("conf/remote-graph.properties")