我只是在尝试使用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()
答案 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()