1

我们有一些 python 脚本来执行 sparql 查询和“更新”(插入/删除)。这是大部分相关代码(我认为):

server = "localhost"
repo = "test"
query_endpoint  = "http://%s:8080/openrdf-sesame/repositories/%s" % (server,repo)
update_endpoint = "http://%s:8080/openrdf-sesame/repositories/%s/statements" % (server,repo)


def execute_query(query):
  params = { 'query': query }
  headers = {
    'content-type': 'application/x-www-form-urlencoded',
    'accept': 'application/sparql-results+json'
  }
  (response, content) = httplib2.Http().request(endpoint, 'POST', urllib.urlencode(params),headers=headers)
  return (response,ast.literal_eval(content))

def execute_update(query):
  params = { 'update': query }
  headers = {
    'content-type': 'application/x-www-form-urlencoded',
    'accept': 'application/sparql-results+json'
  }
  (response, content) = httplib2.Http().request(update_endpoint, 'POST', urllib.urlencode(params),headers=headers)
  return True

我们对 execute_query 的所有调用都非常快,不到 1 秒即可完成。但是,第一次调用 execute_update 需要很长时间(16 秒)。第一个呼叫之后的每个呼叫都在不到 1 秒的时间内运行。我们正在运行 sesame 版本 2.7.12(我们认为从 sesame 版本 2.7.3 升级可能会有所帮助,但并没有太大帮助)。我们只有 2 或 3 千个三元组。这一切都是从 CGI 脚本运行的,所以我们不能真的只让 python 会话保持活动状态来进行更新调用(无论如何,这不是工作台的工作吗?)。关于第一次调用 update_endpoint 需要这么长时间的任何想法?其他人有同样的问题吗?有什么建议的解决方案吗?

谢谢!

编辑 我听从了 RobV 的建议,但我仍然遇到同样的问题。来自 tshark 的日志文件:

 22.577578   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test HTTP/1.1 
 22.578261   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 22.583422   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 200 OK  (application/sparql-results+json)
 22.583857   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 22.591122   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 22.591388   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.020398   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 
 35.025605   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 35.025911   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.040606   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 
 35.045937   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 35.046080   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.049359   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 
 35.053776   10.10.2.43 -> 10.10.2.43   HTTP POST /openrdf-sesame/repositories/test/statements HTTP/1.1 
 35.053875   10.10.2.43 -> 10.10.2.43   HTTP Continuation or non-HTTP traffic
 35.056937   10.10.2.43 -> 10.10.2.43   HTTP HTTP/1.1 204 No Content 

您可以在第一次调用 /statements 端点时看到很大的差距。

4

2 回答 2

3

当我们创建存储库时,我们将其创建为“内存存储”存储库。我创建了一个“Native Java Store”类型的新存储库,现在我的第一次调用很快(因为所有都是后续调用)。

于 2014-07-02T19:44:41.267 回答
2

Sesame 工作台和服务器是两个不同的应用程序,在 Web 应用程序容器内的不同应用程序上下文中运行。

您的 CGI 代码将查询直接定向到 Sesame 服务器,但将更新定向到 Sesame 工作台。

Sesame 工作台实际上只是 Sesame 服务器的 UI,本质上将您的请求代理到底层 Sesame 服务器。第一次进行更新时,Workbench 必须建立与服务器的连接,我认为这涉及向 Sesame 服务器发出各种附加请求以获取元数据。在此之后,工作台缓存了连接,这就是后续更新运行速度非常快的原因。

可以通过将更新端点更改为使用 Sesame 服务器/statements端点来直接针对 Sesame 服务器进行更新,如Sesame HTTP 协议文档中所述,例如

update_endpoint = "http://%s:8080/openrdf-sesame/repositories/%s/statements" % (server,repo)

通过直接攻击 Sesame 服务器,您应该消除第一次更新的长时间延迟。

于 2014-07-02T14:54:43.663 回答