如何在不创建嵌套对象的情况下使rdflib序列化为XML



我有一个具有相互关系的简单节点模型,定义它的RDF文件是一个XML对象的平面列表,每个节点一个。但是,当我使用rdflib解析文件、对其进行操作并将其序列化为新的XML文件时,它并没有保持良好的平面格式。它开始在其他XML对象中嵌套XML对象。我能阻止它那样做吗?

这里有一个简单的例子。如果我有一个简单的树作为我的知识图

A
/   
B     C
/    / 
D   E F   G 

我把它定义为

<rdf:RDF>
<me:Node rdf:about="me:A"/>
<me:Node rdf:about="me:B">
<me:parent rdf:resource="me:A"/>
</me:Node>
<me:Node rdf:about="me:C">
<me:parent rdf:resource="me:A"/>
</me:Node>
<me:Node rdf:about="me:D">
<me:parent rdf:resource="me:B"/>
</me:Node>
<me:Node rdf:about="me:E">
<me:parent rdf:resource="me:B"/>
</me:Node>
<me:Node rdf:about="me:F">
<me:parent rdf:resource="me:C"/>
</me:Node>
<me:Node rdf:about="me:G">
<me:parent rdf:resource="me:C"/>
</me:Node>
</rdf:RDF>

当我先做parse(),然后做serialize()时,输出看起来像

<rdf:RDF>
<me:Node rdf:about="me:F">
<me:parent>
<me:Node rdf:about="me:C">
<me:parent>
<rdf:about="me:A"/>
</me:parent>
</me:Node>
</me:parent>
</me:Node>
<me:Node rdf:about="me:G">
<me:parent rdf:resource="me:C"/>
</me:Node>
<me:Node rdf:about="me:E">
<me:parent>
<me:Node rdf:about="me:B">
<me:parent rdf:resource="me:A"/>
</me:Node>
</me:parent>
</me:Node>
<me:Node rdf:about="me:D">
<me:parent rdf:resource="me:B"/>
</me:Node>
</rdf:RDF>

我意识到这是非常有效和等效的RDF,但它使其他非rdflib工具更难解析文件。是否存在强制所有引用使用";rdf:resource;而不是将引用的节点嵌套在引用节点的XML中?

(注意,这个例子是为了解释我的问题。我很确定,如果只是解析和序列化,这个简单的例子不会被重新排序和嵌套,但在解析和序列化之间进行知识图操作的更复杂的例子会这样做。(

事实证明这是一个简单的答案。当使用";漂亮的xml";您可以指定一个max_depth参数。

graph.serialize(destination=out_file, format='pretty-xml', max_depth=1)

相关内容

最新更新