График rdflib не обновляется. Зачем? - PullRequest
2 голосов
/ 07 декабря 2009

Я пытаюсь понять это поведение. Это определенно не то, что я ожидаю. У меня есть две программы, один читатель и один писатель. Считыватель открывает хранилище графиков 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 " - - - - - - - - "

Вторая программа - это писатель, который добавляет материал в триплет

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()

Я ожидаю увидеть увеличение числа результатов на читателе, когда я отправляю материал с помощью писателя, но этого не происходит. Читатель продолжает возвращать тот же результат, что и при его запуске. Однако если я остановлю читателя и перезапущу его, появятся новые результаты.

Кто-нибудь знает, что я делаю не так?

1 Ответ

3 голосов
/ 07 декабря 2009

Одно простое исправление заключается в том, чтобы поместить "graph.commit ()" сразу после строки "graph = rdflib.ConjunctiveGraph (...)" в читателе Я не уверен, в чем причина и почему коммит перед прочтением исправляет это. Я догадываюсь , что:

  • При открытии соединения MySQLdb транзакция запускается автоматически
  • Эта транзакция не видит обновлений от других, более поздних транзакций.
  • "graph.commit ()" всплывает в каком-то месте "connection.commit ()" где-то, что отбрасывает эту транзакцию и начинает новую.
...