我发帖是因为我在强调Neo4j 2.2.7和OrientDB 2.1.4时遇到了奇怪的结果而我正在寻找解释(我很确定没有错误代码,但如果有人感兴趣,我很乐意分享它)。 以下是事实:
我不断向DB发送以下OSql和Cypher查询,这些查询是等效的(属性名称除外)
SELECT both('Meets').email FROM Employee WHERE nt_account = '<employeeid>'
MATCH (e: Employee {Nt_Account: '<employeeid>'}) -[:MEETS]- (y: Employee) RETURN y.E_Mail
nt_account
和Nt_Account
都已编入索引。
查询的执行时间,平均超过100次重复,是:
使用AKKA演员
尽管有以前的观点,当我从一个线程连续拍摄上述查询时,我测量到Neo4j可以提供约59k的请求,而OrientDB可以提供~16k的请求。
OrientDB可以提供的请求数量始终比Neo4j低3到5倍。
你可以想象,第5点和第6点让我感到震惊,因为我期待OrientDB提供的请求数量最多,因为它可以在几乎一半的时间内执行查询。
有没有人知道发生了什么? 在返回查询结果后,OrientDB是否正在执行某些操作? 我没有正确使用API吗?
更详细信息:
以下是我在OrientDB中执行查询的方法(我找到了这个here):
val start = System.currentTimeMillis()
graph.command(new OCommandSQL(<the_query>)).execute()
val ellapsedTime = System.currentTimeMillis() - start
graph
是一个OrientGraphNoTx
实例,每个actor都有一个这样的实例。
通过使用OrientGraph
和使用REST API稍微降低了一些请求,我得到了可比较的结果。
这是我用来执行Neo4j查询的方法(注意我关闭了JSON流):
def queryRest(query: String): Unit = {
val reqData = s"""{"statements" : [ { "statement" : "$query" } ] }"""
val response = Http("http://localhost:7474/db/data/transaction/commit")
.postData(reqData)
.header("content-type", "application/json")
.header("accept", "application/json;stream=false")
.asString.body.length
}
以下是测量结果(两个表格的最后一行没有太大意义,因为我实现的并行度的有效水平computation_time / 1minute
仅为~12)。