如何将rdflib.term.URIRef转换为带命名空间前缀的字符串
解决方案
你可以直接使用rdflib Graph实例自带的namespace_manager的compute_qname方法实现URIRef到前缀缩写的自动转换,该管理器已经在解析Turtle文件时自动加载了所有定义的前缀映射。
首先封装一个通用转换函数,处理三元组中的不同RDF节点类型:
def format_rdf_node(node, ns_manager): # 仅对URIRef类型做前缀转换 if isinstance(node, rdflib.term.URIRef): try: prefix, _, local_name = ns_manager.compute_qname(node) return f"{prefix}:{local_name}" except Exception: # 找不到对应前缀时返回原始URI return str(node) # 其他类型(Literal、BNode等)直接转字符串 return str(node)
修改后的完整测试代码如下:
#!/usr/bin/env python3 import rdflib from rdflib import Dataset, Graph, URIRef, Literal, Namespace, BNode def format_rdf_node(node, ns_manager): if isinstance(node, rdflib.term.URIRef): try: prefix, _, local_name = ns_manager.compute_qname(node) return f"{prefix}:{local_name}" except: return str(node) return str(node) if __name__=="__main__": g = Graph() g.parse("mwe_schema.ttl") ns_manager = g.namespace_manager for r in g.query( """ SELECT DISTINCT ?aSubject ?aPredicate ?anObject WHERE { ?aSubject ?aPredicate ?anObject } """): s = format_rdf_node(r['aSubject'], ns_manager) p = format_rdf_node(r['aPredicate'], ns_manager) o = format_rdf_node(r['anObject'], ns_manager) print(s, p, o)
补充说明
你的Turtle文件中没有定义rdf:前缀(对应http://www.w3.org/1999/02/22-rdf-syntax-ns#),所以rdf:type会以完整URI输出,和你期望的结果一致。如果需要转换rdf:前缀,只需要在Turtle文件头部添加@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .即可。
内容的提问来源于stack exchange,提问作者vy32
相关产品推荐
相关产品推荐

