如何将 rdflib.term.URIRef 转换回包含命名空间前缀的字符串?
How do I convert a rdflib.term.URIRef back into a string that includes a namespace prefix?
我正在使用 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).
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
查询,该查询是 returns RDF 图,而不是 SPARQL 结果输出。
我正在使用 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).
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
查询,该查询是 returns RDF 图,而不是 SPARQL 结果输出。