我正在研究使用GraphDB的概念证明(特别是HBase上的Titan 0.4.4 )。为此,我创建了一个相对简单的图表:我有买卖产品的公司。销售与买方的一个部门有关:
buyer {name} --BUYS {departmentId}--> product {name} <--SELLS-- seller {name}我在图中填写了1000名买家和卖家,以及100万件产品。每件产品由一家公司销售,随机挑选1至5个部门,由1至6家公司购买。因此,我最终得到了大约100万个顶点和1150万个边。
现在,我想查询图中的如下内容:返回所有名称与名称C的公司D部门购买的给定子字符串S相匹配的产品,我将其实现如下:
启动顶点:
start=graph.query().has("name", C).vertices()由于顶点索引,我创建的返回相对较快(在热身之后< 1ms)。现在,为了获得相应的产品,我运行以下命令:
new GremlinPipeline(start).outE("BUYS").has("departmentId", D )
.inV().has("name", new LowerCaseContainsPredicate(), P ).toList()对于HBase后端( AWS上的10个大型节点)的响应时间非常长,单个用户平均每次查询大约1.5s (我随机选择了买家、部门和产品名称,并迭代了1000 x),返回了大约260个产品记录。为了将可能出现错误的HBase配置从等式中删除,我对本地BerkelyDB (4个CPU、8GB VM内存、16 GB总内存)进行了运行。
当然,这加快了查询的速度,为单个线程应用程序返回了~160 is,这并不是真正的赛车,但仍然可以接受。增加更多的并行请求导致响应时间的快速下降,10个并行请求出现在avg 1.2秒。
因此,我使用这个Cypher查询与Neo4j 2.1.3进行了比较:
start buyer=node:company(name=C) match buyer-[:BUYS {departmentId:D}]->(product)
where product.name =~ "(?i).*P.*" return product它返回的速度要快得多(4-6倍取决于并行请求的数量,~50 10用于单个线程,~270 10用于10并行)。现在有了Neo4j的蓝图实现,所以我也尝试了一下,看看是DB引擎还是我的查询方式带来了不同。
结果发现,在Neo4j上运行Gremlin查询就像在Titan上运行Gremlin查询一样慢--事实上,它甚至稍微慢一些。
所有测试都是作为Java应用程序在一个带有嵌入式图形DB的VM中运行的,以避免任何网络影响。我还注意到,第一个查询总是花费更长的时间,因此应用程序在开始基准测试之前先运行一个随机查询。使用Java类的代码是纯的,上面的代码片段实际上是它正在运行的GremlinePipeline代码(除了谓词,它只实例化一次)。Cypher查询通过使用参数化常量查询字符串并传入相应的参数映射来运行。
这是我第一次使用图DB,所以我想知道我是在做Gremlin查询的根本错误,还是蓝图/Gremlin本身就是慢的。
发布于 2014-08-29 21:50:40
对这个问题的部分回答是,正如Daniel在一条评论中所说的那样,我缺少了Titan上以顶点为中心的索引。除了在名称上创建顶点索引之外,我还需要为购买标签创建一个索引:
graph.makeKey("name").dataType(String.class).indexed(Vertex.class).make();
TitanKey departmentIndex=graph.makeKey("departmentId")
.dataType(String.class).make();
graph.makeLabel("BUYS").sortKey(departmentIndex).make();Neo4j和Cypher仍然更快,显然这对Neo4j上的Gremlin查询没有影响,但这可能只是Neo4j Gremlin实现的一个问题。
发布于 2014-08-27 17:31:44
如果您使用的是Gremlin2,您不能混合Cypher和Gremlin,因为Gremlin使用自动索引,Cypher使用新的“模式索引”。在Neo4j2+中,自动索引被废弃/遗留。因此,在Gremlin3中,Gremlin使用与Cypher相同的指数。因此,如果您想要查看性能,请在两个Neo4jGraphs上进行测试。一个用Gremlin填充它的数据,一个用Cypher填充它的数据。然后,您可以看到实际的速度,因为指数是正确使用。
关于泰坦/HBase。一定要打开缓存,否则你总是会去磁盘(这可能是热的,但没有泰坦的缓存那么快)。请阅读更多内容:http://thinkaurelius.com/2013/11/24/boutique-graph-data-with-titan/
https://stackoverflow.com/questions/25533216
复制相似问题