2

私はこの行動を理解しようとしています。それは間違いなく私が期待するものではありません。リーダーとライターの 2 つのプログラムがあります。リーダーは RDFlib グラフ ストアを開き、2 秒ごとにクエリを実行します。

import rdflib
import random
from rdflib import store
import time

default_graph_uri = "urn:uuid:a19f9b78-cc43-4866-b9a1-4b009fe91f52"

s = rdflib.plugin.get('MySQL', store.Store)('rdfstore')

config_string = "host=localhost,password=foo,user=foo,db=foo"
rt = s.open(config_string,create=False)
if rt != store.VALID_STORE:
    s.open(config_string,create=True)


while True:
    graph = rdflib.ConjunctiveGraph(s, identifier = rdflib.URIRef(default_graph_uri))
    rows = graph.query("SELECT ?id ?value { ?id <http://localhost#ha> ?value . }")
    for r in rows:
        print r[0], r[1]
    time.sleep(2)
    print " - - - - - - - - "

2 番目のプログラムは、トリプルストアに要素を追加するライターです。

import rdflib
import random
from rdflib import store

default_graph_uri = "urn:uuid:a19f9b78-cc43-4866-b9a1-4b009fe91f52"

s = rdflib.plugin.get('MySQL', store.Store)('rdfstore')

config_string = "host=localhost,password=foo,user=foo,db=foo"
rt = s.open(config_string,create=False)
if rt != store.VALID_STORE:
    s.open(config_string,create=True)

graph = rdflib.ConjunctiveGraph(s, identifier = rdflib.URIRef(default_graph_uri))

graph.add( ( 
            rdflib.URIRef("http://localhost/"+str(random.randint(0,100))), 
            rdflib.URIRef("http://localhost#ha"),
            rdflib.Literal(str(random.randint(0,100)))
            ) 
            )
graph.commit()

ライターを使用して内容を送信すると、リーダーで結果の数が増加することが期待されますが、これは起こりません。リーダーは、開始時と同じ結果を返し続けます。ただし、リーダーを停止して再起動すると、新しい結果が表示されます。

誰かが私が間違っていることを知っていますか?

4

1 に答える 1

3

簡単な修正の 1 つは、リーダーの「graph = rdflib.ConjunctiveGraph(...)」行の直後に「graph.commit()」を配置することです。何が原因で、なぜ読み取り前にコミットするとこれが修正されるのかわかりません。私はそれを推測しています:

  • MySQLdb接続を開くと、トランザクションが自動的に開始されます
  • このトランザクションは、他の後のトランザクションからの更新を認識しません。
  • 「graph.commit()」は、このトランザクションを破棄して新しいトランザクションを開始する「connection.commit()」にバブルダウンします。
于 2009-12-07T18:32:16.027 に答える