如何使用rdflib更改`rdf:description`命名空间?

时间:2015-08-25 05:44:20

标签: python rdf rdflib

我只是在尝试使用rdflib使用python管理RDF,并浏览了这个概述了一些RDF语法的页面(http://www.obitko.com/tutorials/ontologies-semantic-web/rdf-graph-and-syntax.html)。其中,RDF示例如下:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:foaf="http://xmlns.com/foaf/0.1/"
    xmlns="http://www.example.org/~joe/contact.rdf#">
  <foaf:Person rdf:about="http://www.example.org/~joe/contact.rdf#joesmith">
    <foaf:mbox rdf:resource="mailto:joe.smith@example.org"/>
    <foaf:homepage rdf:resource="http://www.example.org/~joe/"/>
    <foaf:family_name>Smith</foaf:family_name>
    <foaf:givenname>Joe</foaf:givenname>
  </foaf:Person>
</rdf:RDF>

在这里,RDF对象的代码表示foaf:Person,但在我见过的所有其他实例中,这一行是rdf:Description。我很好奇这个例子是否正确,如果是,那么这个重新定义和标准rdf:Description语法之间有什么区别。此外,如何使用rdflib在python中实现此命名空间?我目前有以下代码,它创建了示例RDF,但它为该行产生了rdf:Description而不是foaf:Person

import rdflib as rd
from rdflib.namespace import FOAF

joe = rd.URIRef("http://www.example.org/~joe/contact.rdf#joesmith")
joeEmail = rd.URIRef('mailto:joe.smith@example.org')
joeHome = rd.URIRef('http://www.example.org/~joe/')
joeFamily = rd.Literal('Smith')
joeName = rd.Literal('Joe')

g = rd.Graph()

g.bind('foaf', FOAF, False)

g.add((joe, FOAF.mbox, joeEmail))
g.add((joe, FOAF.homepage, joeHome))
g.add((joe, FOAF.family_name, joeFamily))
g.add((joe, FOAF.givenname, joeName))

fp = open('outfile.rdf','wb')
fp.write(g.serialize(format='xml'))
fp.close()

1 个答案:

答案 0 :(得分:1)

AHHA!发现这个问题,主要得益于RobV的回应。这一切都是正确的,除了需要RobV提到的joe, RDF.type, FOAF.Person三元组。但是,为了使用示例使用的方式使用rdflib进行格式化,还必须使用&#39; pretty-xml&#39;来对其进行序列化。格式,而不仅仅是&#39; xml&#39;:

...
g.add((joe, RDF.type, FOAF.Person)) # <---- HERE...
g.add((joe, FOAF.mbox, joeEmail))
g.add((joe, FOAF.homepage, joeHome))
g.add((joe, FOAF.family_name, joeFamily))
g.add((joe, FOAF.givenname, joeName))

fp = open('RDF/outfile.rdf','wb')
fp.write(g.serialize(format='pretty-xml'))  # <---- ...AND HERE
fp.close()