2013-05-30 1 views
4

Я хотел бы получить как можно меньше, но все же самосогласованный и рабочий пример использования SPARQL из RDFLib. У меня версия RDFLib 4.0.1.Есть ли пример Hello World для SPARQL с RDFLib?

Я хотел бы иметь код, который делает следующее

  1. Импорт RDFLib.
  2. Создает простой график (от 2 до 4 отношений)
  3. Записывает этот график в файл в формате rdf.
  4. Считывает граф из файла.
  5. Используйте SPARQL, чтобы извлечь что-то из графика.

ДОБАВЛЕНО

Я попробовал сам (первый без записи и чтения из файла), и я не мог сделать. Это то, что у меня есть:

import rdflib 

g = rdflib.ConjunctiveGraph() 

has_border_with = rdflib.URIRef('www.example.org/has_border_with') 
located_in = rdflib.URIRef('www.example.org/located_in') 

germany = rdflib.URIRef('www.example.org/country1') 
france = rdflib.URIRef('www.example.org/country2') 
china = rdflib.URIRef('www.example.org/country3') 
mongolia = rdflib.URIRef('www.example.org/country4') 

europa = rdflib.URIRef('www.example.org/part1') 
asia = rdflib.URIRef('www.example.org/part2') 

g.add((germany,has_border_with,france)) 
g.add((china,has_border_with,mongolia)) 
g.add((germany,located_in,europa)) 
g.add((france,located_in,europa)) 
g.add((china,located_in,asia)) 
g.add((mongolia,located_in,asia)) 

x = g.query("""select ?country where { ?country www.example.org/located_in www.example.org/part1 }""") 
print x 

В результате я получаю:

Traceback (most recent call last): 
    File "hello_world.py", line 23, in <module> 
    x = g.query("""select ?country where { ?country www.example.org/located_in www.example.org/part1 }""") 
    File "/usr/local/lib/python2.7/dist-packages/rdflib-4.0.1-py2.7.egg/rdflib/graph.py", line 1045, in query 
    query_object, initBindings, initNs, **kwargs)) 
    File "/usr/local/lib/python2.7/dist-packages/rdflib-4.0.1-py2.7.egg/rdflib/plugins/sparql/processor.py", line 72, in query 
    parsetree = parseQuery(strOrQuery) 
    File "/usr/local/lib/python2.7/dist-packages/rdflib-4.0.1-py2.7.egg/rdflib/plugins/sparql/parser.py", line 1034, in parseQuery 
    return Query.parseString(q, parseAll=True) 
    File "/usr/lib/python2.7/dist-packages/pyparsing.py", line 1032, in parseString 
    raise exc 
pyparsing.ParseException: Expected "}" (at char 24), (line:1, col:25) 

ответ

7

Есть несколько вопросов:

  1. имя ваших ресурсов, начиная с http://
  2. URL-адресов в запросах SPARQL необходимо <> вокруг них
  3. используйте простой Graph вместо ConjunctiveGraph
  4. вы можете использовать Graph.serialize и Graph.parse методы для сохранения и чтения из файла (см код)

попробовать следующие модификации вашего кода примера:

import rdflib 

g = rdflib.Graph() 
has_border_with = rdflib.URIRef('http://www.example.org/has_border_with') 
located_in = rdflib.URIRef('http://www.example.org/located_in') 

germany = rdflib.URIRef('http://www.example.org/country1') 
france = rdflib.URIRef('http://www.example.org/country2') 
china = rdflib.URIRef('http://www.example.org/country3') 
mongolia = rdflib.URIRef('http://www.example.org/country4') 

europa = rdflib.URIRef('http://www.example.org/part1') 
asia = rdflib.URIRef('http://www.example.org/part2') 

g.add((germany,has_border_with,france)) 
g.add((china,has_border_with,mongolia)) 
g.add((germany,located_in,europa)) 
g.add((france,located_in,europa)) 
g.add((china,located_in,asia)) 
g.add((mongolia,located_in,asia)) 

q = "select ?country where { ?country <http://www.example.org/located_in> <http://www.example.org/part1> }" 
x = g.query(q) 
print list(x) 
# write graph to file, re-read it and query the newly created graph 
g.serialize("graph.rdf") 
g1 = rdflib.Graph() 
g1.parse("graph.rdf", format="xml") 
x1 = g1.query(q) 
print list(x1) 
Смежные вопросы