如何判断/过滤rdflib Literal数据类型?筛选xsd:anyURI类型对象
过滤对象为xsd:anyURI的三元组
要实现只保留对象o数据类型为xsd:anyURI的三元组,你可以通过以下两种方式完成:
方式一:遍历三元组时直接判断
from rdflib import Graph, URIRef, XSD graph = Graph() ttl_input = "dir/file.ttl" graph.parse(ttl_input, format='ttl') # 筛选对象为xsd:anyURI类型的三元组 for s, p, o in graph: # 覆盖两种情况:本身是URI引用,或显式标注了xsd:anyURI类型的字面量 if isinstance(o, URIRef) or (hasattr(o, 'datatype') and o.datatype == XSD.anyURI): print(f"{s} {p} {o}")
方式二:使用SPARQL查询(大数量场景更高效)
如果你的RDF图数据量较大,用SPARQL查询的执行效率会更高:
from rdflib import Graph graph = Graph() ttl_input = "dir/file.ttl" graph.parse(ttl_input, format='ttl') # 编写SPARQL查询语句筛选目标三元组 query = """ SELECT ?s ?p ?o WHERE { ?s ?p ?o . FILTER (datatype(?o) = xsd:anyURI || isURI(?o)) } """ for row in graph.query(query): print(f"{row.s} {row.p} {row.o}")
关键说明
URIRef类型的对象本身就属于xsd:anyURI的范畴,所以优先判断实例类型- 部分数据会显式给字面量标注
xsd:anyURI类型,这时候需要检查对象的datatype属性 - SPARQL语句中的
isURI(?o)匹配所有URI引用,datatype(?o) = xsd:anyURI匹配显式标注类型的字面量,两者结合能覆盖所有符合要求的情况
内容的提问来源于stack exchange,提问作者Mark Miller
相关产品推荐
相关产品推荐

