0

我正在使用 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/#publicusg: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)。

4

1 回答 1

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 结果输出。

于 2021-12-17T07:09:22.000 回答