Что делает "идентификатор" в "Графике"?
Я пытаюсь сделать запрос к базе данных следующим образом:
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 включает псевдонимы для нескольких часто используемых наборов именованных графов. Эти нестандартные расширения предоставляются для удобства и могут использоваться везде, где ожидаются именованные графические 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 для ваших целей.