我有一个具有相互关系的简单节点模型,定义它的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)