首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将rdflib.term.URIRef转换回包含名称空间前缀的字符串?

如何将rdflib.term.URIRef转换回包含名称空间前缀的字符串?
EN

Stack Overflow用户
提问于 2021-11-08 17:12:14
回答 1查看 354关注 0票数 0

我和rdflib一起工作。我正在解析包含名称空间前缀的Turtle文件。当我从SPARQL查询中取回三元组时,它们包含rdflib.term.URIRef元素,这些元素以如下方式打印:

代码语言:javascript
复制
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_schema.ttl

代码语言:javascript
复制
@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

代码语言:javascript
复制
#!/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'])

以下是实际输出:

代码语言:javascript
复制
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

下面是我想要的输出:

代码语言:javascript
复制
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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-17 07:09:22

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查询,而是循环图表,并使用Namespace的qname()函数如下所示:

代码语言:javascript
复制
    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结果,则必须使用返回RDF图的CONSTRUCT查询,而不是SPARQL结果输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69887338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档