任何人都可以提供或指出Neo4j和Titan之间的良好比较?我可以看到的一点是规模 - Titan是横向扩展,需要像cassandra这样的基础可扩展数据存储.Neo4j仅适用于HA,并拥有自己的嵌入式数据库.还有其他优点和缺点吗?任何特定的用例.(Titan目前在哪里使用?)
我还有以下链接:http://architects.dzone.com/articles/16-graph-databases-compared,它给出了图形数据库的客观比较,但没有太多关于Neo4j和Titan之间的利弊.
我已经和Titan图形服务器玩了一段时间了.我的感觉是,尽管有大量文档,但缺乏从头开始入门教程.
我的最终目标是让一个巨人在cassandra上运行并使用StartTheShift/thunderdome进行查询.
我见过几种启动泰坦的方法:
从这个链接,我能够通过以下步骤运行titan服务器:
titan-all-0.3.0/libs
到rexster-server-2.3.0/ext/titan
编辑rexster-server-2.3.0/rexster.xml
和添加(在a之间):
<graph>
<graph-name>geograph</graph-name>
<graph-type>com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration</graph-type>
<graph-read-only>false</graph-read-only>
<graph-location>/Users/vallette/projects/DATA/gdb</graph-location>
<properties>
<storage.backend>local</storage.backend>
<storage.directory>/Users/vallette/projects/DATA/gdb</storage.directory>
<buffer-size>100</buffer-size>
</properties>
<extensions>
<allows>
<allow>tp:gremlin</allow>
</allows>
</extensions>
</graph>
Run Code Online (Sandbox Code Playgroud)对于berkeleydb或:
<graph>
<graph-name>geograph</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>cassandra</storage.backend>
<storage.hostname>77.77.77.77</storage.hostname>
</properties>
<extensions>
<allows>
<allow>tp:gremlin</allow>
</allows>
</extensions>
</graph>
Run Code Online (Sandbox Code Playgroud)
对于cassandra db.
./bin/rexster.sh -s -c rexster.xml
bin/rexster-console.sh
g = rexster.getGraph("geograph")
这种方法的问题是你通过rexster而不是gremlin连接,所以你没有自动完成.优点是您可以命名您的数据库(此处为地理位置).
./bin/titan.sh config/titan-server-rexster.xml config/titan-server-cassandra.properties
创建一个名为cassandra.local
with …
如果有人在另一个数据库之上构建数据库,比如twitter已经完成,那么该数据库是否会继承底层数据库的限制和低效?
我对titan db(http://thinkaurelius.com)特别感兴趣,因为他们声称支持跨节点有效地分割数据集.
他们声称支持跨节点分发数据,因为cassandra的效率.然而,neo4j声称他们不在节点之间分配数据,而是在每个节点上复制整个数据集的原因是因为任何离开一个节点的图遍历,因此必须移动到以太网网络,这太慢了要切合实际.
由于cassandra不了解图形,因此无法优化以在一个节点上保持图形遍历.因此,大多数图遍历将跨越节点边界.
泰坦是否声称跨节点有效扩展?
我无法创建索引.我的Gremlin代码如下:
usernameProperty = mgmt.getPropertyKey('username')
usernameIndex = mgmt.buildIndex('byUsernameUnique', Vertex.class).addKey(usernameProperty).unique().buildCompositeIndex()
mgmt.setConsistency(usernameIndex, ConsistencyModifier.LOCK)
mgmt.commit()
Run Code Online (Sandbox Code Playgroud)
我收到两个错误后不久:
18:04:57 ERROR com.thinkaurelius.titan.graphdb.database.management.ManagementLogger - 从缓存中驱逐[1 @ 0a00009d2537-ip-10-0-0-1572]但等待交易结束的时间太长.过时的交易警报:[standardtitantx [0x6549ce71]] 18:04:57 ERROR com.thinkaurelius.titan.graphdb.database.management.ManagementLogger - 从缓存中驱逐[1 @ 0a00009d2537-ip-10-0-0-1572]但是等待交易结束的时间过长.过时的交易警报:[standardtitantx [0x2a2815cc],standardtitantx [0x025dc2c0]]
索引的状态停留在INSTALLED
:
usernameIndex.getIndexStatus(usernameProperty)
==>INSTALLED
Run Code Online (Sandbox Code Playgroud)
我读到失败的实例可能会导致问题,但检查正在运行的实例只显示一个:
mgmt.getOpenInstances()
==>0a00009d3011-ip-10-0-0-1572(current)
Run Code Online (Sandbox Code Playgroud)
我也尝试发布一个REGISTER_INDEX
动作,它也会从事务缓存中逐出,并带有类似的错误消息:
mgmt.updateIndex(usernameIndex, SchemaAction.REGISTER_INDEX).get()
mgmt.commit()
Run Code Online (Sandbox Code Playgroud)
我也尝试过多次重启服务器.
注册过程似乎只是超时,导致事务缓存"逐出".我等了48个小时才确定这不是一个缓慢的过程.对Titan的正常读取,写入和关联提交似乎工作正常,我只是无法创建此索引.我被卡住了,还有什么我可以尝试的吗?有没有办法延长该事务的超时?
我正在使用DynamoDB后端运行Titan 1.0.0(使用AWS提供的CloudFormation模板进行设置).
编辑:这是我正在粘贴Gremlin的完整命令,添加awaitGraphStatus
了@MTA建议的步骤:
mgmt = graph.openManagement();
usernameIndex = mgmt.getPropertyKey('usernameIndex');
mgmt.buildIndex('byUsername',Vertex.class).addKey(usernameIndex).unique().buildCompositeIndex();
// I have tried with and without a commit here: mgmt.commit();
mgmt.awaitGraphIndexStatus(graph, 'byUsername').status(SchemaStatus.REGISTERED).timeout(10, java.time.temporal.ChronoUnit.MINUTES).call();
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
com.thinkaurelius.titan.graphdb.database.management.GraphIndexStatusWatcher.call(GraphIndexStatusWatcher.java:52)中的java.lang.NullPointerException,地址为com.thinkaurelius.titan.graphdb.database.management.GraphIndexStatusWatcher.call(GraphIndexStatusWatcher.java:18) )atg.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)中的java_util_concurrent_Callable $ call.call(未知来源)atg.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java) :110)org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114)at groovysh_evaluate.run(groovysh_evaluate:3)at …
我刚刚进入图形数据库,我似乎一直在遇到一个问题,决定使用"索引节点"还是"索引属性"来跟踪"节点类型"之类的事情.由于到目前为止我没有真正的经验,我没有任何信息可以作出决定,这两种方法似乎同样有效.
因此,问题是:两种方法之间的权衡是什么,以及规模(即节点数量)如何影响决策?
对于示例场景,我们假设有两种类型的"事物":User
并且Product
,用户节点和产品节点之间的边缘并不重要,但我们关心的是我们是否需要type: User
和type: Product
每个节点上的属性或者,如果我们希望每个节点分别具有指向User
节点和Product
节点的边缘.
在哪种情况下哪种方法更好?
注意:我特别关注Neo4j和Titan,但我认为这也会更普遍地应用.
我试图建立一个完全基本的Titan Rexster Cassandra实例,但我似乎无法打破代码.我现在已经尝试了很多东西来使它工作,但我似乎无法让它工作.无论我读了多少,我都无法正确设置它.
我想要的是一个以嵌入模式运行的Titan-rexster-cassandra实例,其中包含一些索引,包括弹性搜索.在我阅读完所有内容之后,似乎这是我在下载titan-server-0.4.0并运行bin/titan.sh start
命令时应该得到的.这也启动了服务器.但是:当我尝试为此添加索引时,没有任何反应.当我尝试在RexPro上填充它时,没有添加任何内容.
当我重新启动服务器时,我的图表消失了.当我去的时候,它不再出现在Rexster图表列表中http://localhost:8182/graphs
.因此看起来我的数据不会持续存在,或者至少在rexster中消失.
我觉得我已经尝试了一切来实现这个目的:
.properties
包含搜索索引,如下所示:storrage.index.search.backend=elasticsearch
....properties
(所有的)使用的文件cassandra
,embeddedcassandra
并cassandrathrift
为storage.backend
titan.sh
文件,看看实际发生了什么,然后转到这些指示的配置文件,并看看那里发生了什么,我已经尝试了很多东西,如上所述.我已经在这一周内挣扎了一个多星期,可能是两个甚至更多,我开始失去信心.我正在考虑回到neo4j,但不幸的是我真的需要Titan的可扩展性.但是,如果我不能让它工作,那就没用了.我觉得可能有一些微不足道但却必不可少的事情,我没想到或忘记了.
有没有人知道那里的指南带你从绝对的划痕(例如,启动一个新的VM或其他东西),或接近它,到一个运行弹性搜索索引的titan-rexster-cassandra实例?或许,如果你很棒,提供这样的指南?我感到失落 :(
关键点:
Ubuntu 12.04(也试过13.10.同样的问题)
泰坦0.4.0
目标:要获得持久性,请使用弹性搜索索引顶点名称属性,并获得具有权重的边.
像这样连接ruby rexpro:
require "rexpro" #the "rexpro" gem
rexpro_client = Rexpro::Client.new(host: 'the.ip.of.my.machine.running.rexster', port: 8184)
results = rexpro_client.execute("g.getClass()", graph_name: "graph").results
#=> returns the following: class com.thinkaurelius.titan.graphdb.database.StandardTitanGraph
Run Code Online (Sandbox Code Playgroud)
我遵循以下步骤来创建数据库不存在的问题:
Ubuntu 12.04 LTS
使用名称vmname
(或其他)创建一个新的小型(1核,1.75GB ram)VM .ssh azureuser@vmname.cloudhost.net -p 22 …
我一直在关注管理系统,但有些事情仍然无法实现.基本上我想做的是:
它基本上就像映射图模式一样.
我尝试了一些东西,但我只获得了部分数据.
g.getIndexdKeys(<Vertex or Edge>);
//basic information. Doesn't seem to return any buildEdgeIndex() based indexes
mgmt.getVertexLabels();
// gets labels, can't find a way of getting indexes attached to these labels.
mgmt.getGraphIndexes(Vertex.class);
// works nicely I can retrieve Vertex indexes and get pretty much any
// information I want out of them except for information regarding
// indexOnly(label). So I can't tell what label these indexes are attached to.
mgmt.getGraphIndexes(Edge.class);
// doesn't seem to return any buildEdgeIndex() indexes. …
Run Code Online (Sandbox Code Playgroud) 我想删除两个顶点之间的边,所以我的代码在java tinkerpop3中如下
private void removeEdgeOfTwoVertices(Vertex fromV, Vertex toV,String edgeLabel,GraphTraversalSource g){
if(g.V(toV).inE(edgeLabel).bothV().hasId(fromV.id()).hasNext()){
List<Edge> edgeList = g.V(toV).inE(edgeLabel).toList();
for (Edge edge:edgeList){
if(edge.outVertex().id().equals(fromV.id())) {
TitanGraph().tx();
edge.remove();
TitanGraph().tx().commit();
return;//Remove edge ok, now return.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法通过直接查询到该边缘并删除它来删除两个顶点之间的边缘?谢谢您帮忙.
我使用Titan 0.4.0 All,在Ubuntu 12.04上以共享VM模式运行Rexster.
我怎样才能正确删除使用Cassandra存储后端的Titan中的图形?
我试过了TitanCleanup.clear(graph)
,但它并没有删除所有内容.指数仍在那里.我真正的问题是我有一个我不想要的索引(它会崩溃每个查询),但是我了解Titan的文档,一旦创建了索引就不可能删除它.
当我接近这个时,我试图对这两种技术进行比较,我想知道你们是否已经有过处理任何一种或两种技术的经验?在处理类似的用例时,我主要对性能数字感兴趣.