1

sparql クエリと「更新」(挿入/削除) の両方を実行するための Python スクリプトがいくつかあります。関連するコードのほとんどは次のとおりです(私は思います):

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 秒未満で実行されます。私たちはセサミのバージョン 2.7.12 を実行しています (セサミのバージョン 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

2

Sesame ワークベンチとサーバーは、Web アプリケーション コンテナー内の別々のアプリケーション コンテキストで実行される 2 つの異なるアプリケーションです。

CGI コードはクエリを Sesame サーバーに直接送信しますが、更新は Sesame ワークベンチに送信します。

Sesame ワークベンチは、実際には Sesame サーバーの単なる UI であり、基本的には基になる Sesame サーバーにリクエストをプロキシします。初めて更新を行うとき、Workbench はサーバーへの接続を確立する必要があります。これには、Sesame サーバーにメタデータを求めるさまざまな追加要求を行うことが含まれると思います。この後、接続はワークベンチによってキャッシュされるため、その後の更新は非常に高速に実行されます。

Sesame HTTP プロトコル/statementsのドキュメントで説明されているように、代わりに Sesame サーバー エンドポイントを使用するように更新エンドポイントを変更することで、Sesame サーバーに対して直接更新を送信できます。

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

Sesame サーバーに直接アクセスすることで、最初の更新での長い遅延をなくすことができます。

于 2014-07-02T14:54:43.663 に答える