gpt4 book ai didi

python - 使用猫头鹰 :Class prefix with rdflib and xml serialization

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:07 25 4
gpt4 key购买 nike

我想在我的 RDF 本体的 XML 序列化中使用 owl: 前缀(使用 rdflib 版本 4.1.1);不幸的是,我仍然将序列化为 rdf:Description 标签。我已经在 RDFLib: Namespace prefixes in XML serialization 查看了关于将命名空间绑定(bind)到图形的答案。但这似乎只有在使用 ns 格式而不是 xml 格式进行序列化时才有效。

让我们更具体一点。我正在尝试在 XML 中获取以下本体(取自 Introducing RDFS and OWL),如下所示:

<!-- OWL Class Definition - Plant Type -->
<owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">

<rdfs:label>The plant type</rdfs:label>
<rdfs:comment>The class of all plant types.</rdfs:comment>

</owl:Class>

这是使用 rdflib 构建这样一个东西的 python 代码:

from rdflib.namespace import OWL, RDF, RDFS
from rdflib import Graph, Literal, Namespace, URIRef

# Construct the linked data tools namespace
LDT = Namespace("http://www.linkeddatatools.com/plants#")

# Create the graph
graph = Graph()

# Create the node to add to the Graph
Plant = URIRef(LDT["planttype"])

# Add the OWL data to the graph
graph.add((Plant, RDF.type, OWL.Class))
graph.add((Plant, RDFS.subClassOf, OWL.Thing))
graph.add((Plant, RDFS.label, Literal("The plant type")))
graph.add((Plant, RDFS.comment, Literal("The class of all plant types")))

# Bind the OWL and LDT name spaces
graph.bind("owl", OWL)
graph.bind("ldt", LDT)

print graph.serialize(format='xml')

遗憾的是,即使使用那些绑定(bind)语句,也会打印以下 XML:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
<rdf:Description rdf:about="http://www.linkeddatatools.com/plants#planttype">
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdfs:label>The plant type</rdfs:label>
<rdfs:comment>The class of all plant types</rdfs:comment>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
</rdf:Description>
</rdf:RDF>

诚然,这仍然是一个 Ontology,并且可用 - 但由于我们有各种编辑器,因此使用 owl 前缀的更紧凑和可读性更高的第一个版本会更可取。是否可以在 rdflib 中执行此操作而不覆盖序列化方法?

更新

作为对评论的回应,我将重新表述我的“奖励问题”,作为对我的问题的简单澄清。

不是奖励问题 这里的主题涉及 OWL 命名空间格式化本体的构造,它是更冗长的 RDF/XML 规范的简写。尽管这里的问题比简单声明 namespace 前缀仅用于类或属性的速记要大,但在代码中必须处理许多速记符号;例如 owl:Ontology 描述应该添加到这个符号中作为良好的形式。我希望 rdflib 支持完整的符号规范——而不是必须推出我自己的序列化。

最佳答案

您需要使用pretty-xml 格式,而不是使用xml 格式。它在文档中列出,Plugin serializers .这将为您提供所需的输出类型。也就是说,您将使用类似以下的行来使用 PrettyXMLSerializer :

print graph.serialize(format='pretty-xml')

为了解决“奖金问题”,您可以添加如下一行来创建本体标题,然后使用 pretty-xml 序列化将为您提供以下输出。

graph.add((URIRef('https://stackoverflow.com/q/24017320/1281433/ontology.owl'), RDF.type, OWL.Ontology ))
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
<owl:Ontology rdf:about="https://stackoverflow.com/q/24017320/1281433/ontology.owl"/>
<owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">
<rdfs:comment>The class of all plant types</rdfs:comment>
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdfs:label>The plant type</rdfs:label>
</owl:Class>
</rdf:RDF>

添加 x rdf:type owl:Ontology 三元组并不是一种非常以 OWL 为中心的声明本体的方式。听起来您正在寻找更像 Jena 的 OntModel 接口(interface)(它只是 Jena 的以 RDF 为中心的模型的便利层)或 OWLAPI 的东西,但对于 RDFLib。我不知道这样的事情是否存在(我不是 RDFlib 用户),但你可以看看:

  • RDFLib/OWL-RL : 它看起来像一个推理机,但它可能有一些你需要的方法。
  • Inspecting an ontology with RDFLib :一篇带有源链接的博客文章,可能会满足您的某些需求。
  • Is there a Python library to handle OWL? :一个 Stack Overflow 问题(现在是题外话,因为库/工具请求是题外话,但这是一个老问题),其中接受的答案指出 rdflib 是以 RDF 为中心的,而不是以 OWL 为中心的,但其他一些答案可能会有用,特别是 this one ,尽管其中大部分已经过时,即使在 2011 年也是如此。

关于python - 使用猫头鹰 :Class prefix with rdflib and xml serialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24017320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com