Как преобразовать rdflib.term.URIRef обратно в строку, содержащую префикс пространства имен?
Я работаю с rdflib. Я разбираю файлы Turtle, которые включают префиксы пространства имен. Когда я получаю свои тройки из запроса SPARQL, они содержат
rdflib.term.URIRef
элементы, которые печатаются следующим образом:
http://resources.data.gov/resources/dcat-us/#public
Мой график rdflib знает, что
usg:
это префикс пространства имен для
http://resources.data.gov/resources/dcat-us/#
. Я бы хотел преобразовать
http://resources.data.gov/resources/dcat-us/#public
вернуться к
usg:public
о печати.
MWE
Вот файл
mwe_schema.ttl
:
@prefix usg: <http://resources.data.gov/resources/dcat-us/#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix dct: <http://purl.org/dc/terms/#> .
usg:public
a rdfs:Property ;
rdfs:label "public"@en ;
rdfs:comment "Data asset is or could be made publicly available to all without restrictions." ;
.
Вот программа
mwe_demo.py
:
#!/usr/bin/env demonstrate python namespaces
import rdflib
from rdflib import Dataset, Graph, URIRef, Literal, Namespace, BNode
if __name__=="__main__":
g = Graph()
g.parse("mwe_schema.ttl")
for r in g.query(
"""
SELECT DISTINCT ?aSubject ?aPredicate ?anObject
WHERE {
?aSubject ?aPredicate ?anObject
}
"""):
d = r.asdict()
print(d['aSubject'],d['aPredicate'],d['anObject'])
Вот фактический результат:
http://resources.data.gov/resources/dcat-us/#public http://www.w3.org/2000/01/rdf-schema#comment Data asset is or could be made publicly available to all without restrictions.
http://resources.data.gov/resources/dcat-us/#public http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://www.w3.org/2000/01/rdf-schema#Property
http://resources.data.gov/resources/dcat-us/#public http://www.w3.org/2000/01/rdf-schema#label public
Вот мой желаемый результат:
usg:public rdfs:comment rdfs:Property
usg:public http://www.w3.org/1999/02/22-rdf-syntax-ns#type rdfs:Property
usg:public rdfs:label public
(Я возьму на себя поворот последнего
public
в `" public"@en).
1 ответ
Результаты запросов SPARQL сами по себе не являются RDF, а являются форматами результатов SPARQL (см. https://www.w3.org/TR/2013/REC-sparql11-results-json-20130321/).
Это означает такие результаты, как
http://resources.data.gov/resources/dcat-us/#public
являются строками в JSON или XML, а не объектами RDFlib URIref, которые могут быть легко снабжены префиксом.
Чтобы сжать эти URI с заданными префиксами, не выполняйте запрос SPARQL, а циклически просматривайте граф и используйте диспетчер пространства имен.
qname()
функционировать следующим образом:
for s, p, o in g:
for x in [s, p, o]:
print(g.qname(x) if isinstance(x, URIRef) else x, end=" ")
print()
Если вы действительно хотите сжать результаты SPARQL, вам придется использовать
CONSTRUCT
запрос, который возвращает график RDF, а не вывод результатов SPARQL.