【问题标题】:rdflib not parsing RDF/XML filerdflib 不解析 RDF/XML 文件
【发布时间】:2020-12-16 20:00:56
【问题描述】:

我正在尝试使用 rdflib 以 xml 格式加载和解析一个非常简单的 rdf 文件。 我不认为,它解析正确。这是我的 rdf/xml 文件,

<rdf:RDF xmlns:rdf="http://w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:foaf="http://xmlns.com/foaf/0.1/"
>

  <foaf:Person>
    <foaf:name>Peter Parker</foaf:name>
  </foaf:Person>

</rdf:RDF>

我的python脚本在这里,

from rdflib import Graph

g = Graph()
g.parse("person_1.rdf", format="xml")

print(len(g))

print(g.serialize(format="xml").decode("u8"))

print("Test - 2")

还有,这是程序输出,

3
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
   xmlns:foaf="http://xmlns.com/foaf/0.1/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
  <rdf:Description rdf:nodeID="Nababb97ad88341329a7cf22cec65c00c">
    <rdf:type rdf:resource="http://w3.org/1999/02/22-rdf-syntax-ns#RDF"/>
    <foaf:Person rdf:nodeID="Nfa7b9ab24fae4bcd9ffbaa13aeb733db"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="Nfa7b9ab24fae4bcd9ffbaa13aeb733db">
    <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/name"/>
  </rdf:Description>
</rdf:RDF>

Test - 2

我在输出中没有看到“Peter Parker”这个名字。难道我做错了什么。 提前致谢。

【问题讨论】:

  • 我不是 rdflib 专家,但是没有 foaf 导入,也没有 foaf:Person 和 foaf:name 的声明,所以解析器会被它们的使用弄糊涂。它会解释结果。
  • @Ignazio 这与导入无关,不是 OWL,而是普通 RDF
  • 长存储短:它只是无效的 RDF/XML - 它看起来更像 TO 使用带有一些前缀的纯 XML。请与 RDF/XML 语法规范进行比较:w3.org/TR/rdf-syntax-grammar - 你应该看到一些明显的区别

标签: python rdf semantic-web rdflib foaf


【解决方案1】:

您将在文档周围加上 foafpersonal profile 文档属性,如下所示

<foaf:PersonalProfileDocument>
  <foaf:Person>
    <foaf:family_name>Peter Parker</foaf:family_name>
  </foaf:Person>
</foaf:PersonalProfileDocument>
</rdf:RDF>

然后导入foaf命名空间如下

from rdflib.namespace import FOAF , XSD

【讨论】:

    【解决方案2】:

    如果你只是想检索数据,试试下面的方法。

    from simplified_scrapy import utils, SimplifiedDoc, req
    xml = '''
    <rdf:RDF xmlns:rdf="http://w3.org/1999/02/22-rdf-syntax-ns#" 
             xmlns:foaf="http://xmlns.com/foaf/0.1/"
    >
    
      <foaf:Person>
        <foaf:name>Peter Parker</foaf:name>
      </foaf:Person>
    
    </rdf:RDF>
    '''
    # xml = utils.getFileContent('person_1.rdf')
    doc = SimplifiedDoc(xml)
    print(doc.select('foaf:Person>foaf:name>text()'))
    # Or
    print(doc.select('foaf:name>text()'))
    # Or
    print(doc.select('foaf:name'))
    

    结果:

    Peter Parker
    Peter Parker
    {'tag': 'foaf:name', 'html': 'Peter Parker'}
    

    【讨论】:

    • 您好 Yazz,感谢您的解决方案。但是这个解决方案使用了一个不同于 rdflib 的模块。我正在尝试学习 rdflib 的用法。我想知道为什么 rdflib 不能按预期工作。
    • @LaeeqKhan 对不起,我也不懂 rdflib。祝你好运。
    【解决方案3】:

    我在解析这个 RDF 时没有发现任何问题——它是有效的 RDF——但是你在重新序列化时没有看到好的结果的原因是它是一个没有意义的糟糕 RDF!您需要标识人员节点。如果你知道 Peter Parker 的 URI 是 http://example.com/person/pp 那么你可以使用:

    <?xml version="1.0" encoding="utf-8"?>
    <rdf:RDF
      xmlns:foaf="http://xmlns.com/foaf/0.1/"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    >
      <foaf:Person rdf:about="http://example.com/person/pp">
        <foaf:name>Peter Parker</foaf:name>
      </foaf:Person>
    </rdf:RDF>
    

    如果你不知道 Peter Parker 的 URI,你可以使用空白节点:

    <?xml version="1.0" encoding="utf-8"?>
    <rdf:RDF
      xmlns:foaf="http://xmlns.com/foaf/0.1/"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    >
      <foaf:Person rdf:nodeID="ub2bL2C1">
        <foaf:name>Peter Parker</foaf:name>
      </foaf:Person>
    </rdf:RDF>
    

    但是到目前为止,RDF 的所有内容都是为了更好地为人员分配 URI。

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多