Как преобразовать 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.

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