Что делает "идентификатор" в "Графике"?

Я пытаюсь сделать запрос к базе данных следующим образом:

from rdflib import Graph, Literal, URIRef
from rdflib.namespace import RDF, SKOS
from rdflib.plugins.stores import sparqlstore


# define endpoint according to https://www.stardog.com/docs/
endpoint = 'http://path/to/query'  # http://<server>:<port>/{db}/query

# create store
store = sparqlstore.SPARQLUpdateStore()

# I only want to query
store.open(endpoint)
store.setCredentials('me', 'my_pw')

# What does this actually do? That runs through
default_graph = URIRef('some:stuff')
ng = Graph(store, identifier=default_graph)
# # If identifier is not defined, it crashes
# ng = Graph(store)

rq = """
SELECT ?foo ?bar 
WHERE {
  ?something a <http://path/to/data/.ttl#SomeValues>.
  ?something <http://path/to/data/.ttl#foo> ?foo.
  ?something <http://path/to/data/.ttl#bar> ?bar.                       
}
"""

query_res = ng.query(rq)
for s, l in query_res:
    print(s, l)

К сожалению, на данный момент я не получаю никаких результатов:

<head><variable name="foo"></variable><variable name="bar"></variable></head><results></results></sparql>

Мой вопрос в том, что identifier в Graph то есть, важно ли это, и если да, то как это должно быть определено. Когда я не определяю это, код падает с:

Ответ: b'{"message":"В URI не найден символ разделителя: N53e412e0f3a74d6eab7ed6da163463bf"}'

Если я добавлю что-нибудь еще с двоеточием или косой чертой, оно будет выполнено (но запрос все равно ничего не возвращает).

Не мог бы кто-нибудь кратко объяснить, что нужно добавить туда и может ли это быть причиной неудачного запроса (сама команда запроса правильная; когда я вызываю ее из другого инструмента, она работает нормально)?

1 ответ

Решение

identifier аргумент Graph Конструктор позволяет идентифицировать граф RDFLib. Если значение None, тогда пустой узел используется в качестве идентификатора.

Однако если store значение является SPARQLUpdateStore тогда identifier значение также используется как default-graph-uri протокола SPARQL, и, следовательно, не может быть пустым узлом.

Таким образом, проблема заключается в следующем: как называется "неназванный" график по умолчанию в удаленном хранилище триплетов?

Из документации Stardog:

Именование

Stardog включает псевдонимы для нескольких часто используемых наборов именованных графов. Эти нестандартные расширения предоставляются для удобства и могут использоваться везде, где ожидаются именованные графические IRI. Сюда входят запросы и обновления SPARQL, операции с графами свойств и значения конфигурации. Ниже приведен список специальных именованных графиков IRI.

          Named Graph IRI                             Refers to                
--------------------------------  ---------------------------------------------
tag:stardog:api:context:default   the default (no) context graph              
tag:stardog:api:context:all       all contexts, including the default graph    
tag:stardog:api:context:named     all named graphs, excluding the default graph

Я не могу найти публичную частную конечную точку Stardog (кажется, что конечная точка ABS не работает). Пример на DBpedia:

from rdflib import Graph, URIRef
from rdflib.plugins.stores import sparqlstore

store = sparqlstore.SPARQLUpdateStore()
store.open('http://dbpedia.org/sparql')

default_graph = URIRef('http://people.aifb.kit.edu/ath/#DBpedia_PageRank') 
ng = Graph(store, identifier=default_graph)

rq = """
    SELECT ?foo ?foobar {
      ?foo ?foobar ?bar                       
    } LIMIT 100
"""

query_res = ng.query(rq)
for s, l in query_res:
    print(s, l)

Результаты похожи на то, что они должны быть. Даже в вашем коде имя безымянного графа является единственной проблемой, полученные результаты являются правильными результатами SPARQL XML.


PS Возможно, вы могли бы попробовать /questions/tagged/sparqlwrapper вместо rdflib для ваших целей.

Другие вопросы по тегам