使用RDFlib获取Literal对象的lang值
我有一个rdf文件:
<!DOCTYPE rdf:RDF [
<!ENTITY db "http://dbpedia.org/ontology/" >
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >]>
<rdf:RDF xmlns="http://dbpedia.org/ontology/"
xml:base="http://dbpedia.org/ontology/"
xmlns:db="http://dbpedia.org/ontology/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<owl:ObjectProperty rdf:about="&db;actingHeadteacher">
<rdfs:label xml:lang="el">διευθυντής σχολείου</rdfs:label>
<rdfs:label xml:lang="en">acting headteacher</rdfs:label>
</owl:ObjectProperty>
</rdf:RDF>
我想根据它们的语言值来筛选文字对象。例如:
from rdflib import Graph
from rdflib.namespace import RDFS
filetype = util.guess_format(rdf_file)
g = Graph()
g.parse(rdf_file, format = filetype)
for s,p,o in g.triples((None, RDFS.label, None)):
print(repr(o)) # rdflib.term.Literal('acting headteacher', lang='en')
# rdflib.term.Literal('διευθυντής σχολείου', lang='el')
我只想查询语言为'en'的o。
2 个回答
2
在rdflib中可能有更优雅或更高效的解决方案,但你可以使用SPARQL查询来实现:
g = Graph()
g.parse("../stw.nt", format="nt")
qres = g.query(
"""SELECT ?label
WHERE {
?s ?p ?label
FILTER langMatches( lang(?label), "en" )
}"""
)
for row in qres:
print(row.label)
5
当你查看 rdflib的手册 时,你会发现 rdflib.term.Literal
有一个叫 language
的属性,还有一个方法。不过,我发现调用这个方法似乎没有效果。
像下面这样的代码可能会有效:
# from rdflib import URIRef
subject = URIRef('&db;actingHeadteacher')
# just getting your literals directly here:
generator = graph.objects(subject, RDFS.label)
for lit in generator:
print lit.language
只有 label
或 preferredLabel
如果你只对标签或优选标签(无论是SKOS还是RDFS)感兴趣,可以查看 手册第47页:
subject = URIRef('&db;actingHeadteacher')
graph.preferredLabel(subject=subject, label='en') # or label='el'
这会返回一个 (labelProp, label)
的列表,其中 labelProp
可以是 skos:prefLabel
或 rdfs:label
。