3

我有一个 rdf 文件,例如:

<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dbp="http://dbpedia.org/ontology/"
xmlns:dbprop="http://dbpedia.org/property/"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
    <rdf:Description rdf:about="http://dbpedia.org/page/Johann_Sebastian_Bach">
      <dbp:birthDate>1685-03-21</dbp:birthDate>
      <dbp:deathDate>1750-07-28</dbp:deathDate>
      <dbp:birthPlace>Eisenach</dbp:birthPlace>
      <dbp:deathPlace>Leipzig</dbp:deathPlace>
      <dbprop:shortDescription>German composer and organist</dbprop:shortDescription>
      <foaf:name>Johann Sebastian Bach</foaf:name>
      <rdf:type rdf:resource="http://dbpedia.org/class/yago/GermanComposers"/>
      <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/>
    </rdf:Description>
</rdf:RDF> 

我只想提取这个文件的文本部分,即在这种情况下我的输出是:

output_ tex = "Johann Sebastian Bach, German composer and organist,1685-03-21, 1750-07-28, Eisenach, Leipzig"

如何使用 RDFlib 获得此结果?

4

2 回答 2

7

基于Joshua Taylor的回答,您正在寻找的方法是“toPython”,文档说“返回从这个 RDF Literal 派生的适当的 python 数据类型”。此代码段应返回您要查找的内容:

raw_data = """<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dbp="http://dbpedia.org/ontology/"
xmlns:dbprop="http://dbpedia.org/property/"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
    <rdf:Description rdf:about="http://dbpedia.org/page/Johann_Sebastian_Bach">
      <dbp:birthDate>1685-03-21</dbp:birthDate>
      <dbp:deathDate>1750-07-28</dbp:deathDate>
      <dbp:birthPlace>Eisenach</dbp:birthPlace>
      <dbp:deathPlace>Leipzig</dbp:deathPlace>
      <dbprop:shortDescription>German composer and organist</dbprop:shortDescription>
      <foaf:name>Johann Sebastian Bach</foaf:name>
      <rdf:type rdf:resource="http://dbpedia.org/class/yago/GermanComposers"/>
      <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/>
    </rdf:Description>
</rdf:RDF>"""
import rdflib
graph = rdflib.Graph()
graph.parse(data=raw_data)

output = []

for s, p, o in graph:
    if type(o) == rdflib.term.Literal:
        output.append(o.toPython())

print ', '.join(output)
于 2013-10-11T19:34:25.463 回答
4

这是相对简单的,至少在概念任务方面。你需要

  • 将 RDF 文档读入 rdflib Graph
  • 遍历图中的语句(三元组)
    • 如果语句的对象是文字
    • 然后将文字的词法形式连接到您正在构建的字符串中

我不是 Python 用户,也不是 RDFlib 用户,但这些应该不难。 RDFLib 入门(来自 RDFlib 文档)展示了如何读取图形并迭代三元组

import rdflib

g = rdflib.Graph()
result = g.parse("http://www.w3.org/People/Berners-Lee/card")

# Iterate over triples in store and print them out.
print("--- printing raw triples ---")
for s, p, o in g:
    print((s, p, o))

现在,您需要检查是否是文字(的实例),而不是print((s,p,o))在该正文中。如果存在非字符串类型的字面量,您要么想要连接它们的词法形式,要么只连接普通文字(没有语言类型和数据类型的文字)、带有语言标签的文字的字符串部分和词法形式的数据类型为.forordflib.term.Literalxsd:string

更多参考资料

于 2013-10-11T14:38:18.923 回答