问题描述
使用rdflib serialize()方法打印图形时遇到以下问题。布局与用于创建图形的原始文件有所不同。
代码如下
from rdflib import Graph
mapping_graph = Graph().parse("valid_mapping.ttl",format="ttl")
print(mapping_graph.serialize(format="ttl").decode("utf-8"))
哪个输出
<file:///home/alex/Desktop/Mapping-Quality-Framework/Mapping-Quality-Model/valid_mapping.ttl#TripleMap1> rr:logicalTable [ rr:tableName "people" ] ;
rr:predicateObjectMap [ rr:objectMap [ rr:column "publications" ;
rr:language "en-GB" ] ;
rr:predicate foaf:publications ;
rr:termType rr:Literal ],[ rr:objectMap [ rr:column "age" ;
rr:datatype xsd:second ] ;
rr:predicate foaf:age ],[ rr:objectMap [ rr:column "age" ;
rr:datatype xsd:third ;
rr:language "dhhdhd" ] ;
rr:predicate dbo:equipment ] ;
rr:subjectMap [ rr:class foaf:ggg ] .
输入文件为
<#TripleMap1>
rr:logicalTable [ rr:tableName "people" ] ;
rr:subjectMap [ rr:class foaf:ggg ];
rr:predicateObjectMap [ rr:predicate foaf:publications ;
rr:termType rr:Literal;
rr:objectMap [ rr:column "publications" ;
rr:language "en-GB" ] ;
];
rr:predicateObjectMap
[ rr:predicate foaf:age;
rr:objectMap [ rr:column "age" ;
rr:datatype xsd:second ] ;
];
rr:predicateObjectMap
[ rr:predicate dbo:equipment;
rr:objectMap [ rr:column "age" ;
rr:datatype xsd:third;
rr:language "dhhdhd"] ; ] ;
.
通过serialize()方法更改图形的布局。
我们将不胜感激任何帮助。
解决方法
@UninformedUser的评论是正确的:您正在要求的东西不是Turtle语法设计的。我已经看到这个问题-有关使人困惑的不同形式的序列化-出现了几次。 Turtle不像JSON甚至XML和其他可以特定方式排序的格式。这是因为从根本上讲,RDF图中没有排序。例如,不可能知道并因此重复使用对等的空白节点的单个订单。
您的各种Turtle文件都是同构的,以图形的形式表示,等同于所得到的东西!
一个半解决方案是实现一个半确定性的序列化程序,该序列化程序以特定的方式对事物进行排序,但这始终会假设空白节点ID等。您可以在RDFlib的序列化程序之上创建这样的序列化程序,该序列化程序将接收RDFlib序列化的文件(Turtle或N3等),并以某种方式对其进行排序。之前,我已经为Git进行了个性化的排序,并通过属性值的哈希值对空白节点进行了排序。您可以在特定情况下使用它,但一般而言,它可能不作为数据的序列化器。
您还可以研究与静态Turtle结构无关的向用户传递RDF数据的方法。您可以编写一个小函数来对图表中的事物进行计数,并以此为基础进行比较,例如:
1 x rr:逻辑表 1 x rr:subjectMap ... 2 x rr:predicateObjectMap
或者,更具体的领域:
以某种固定格式列出数据中的rr:tableName和rr:column值,以便于比较。
我最终的建议是某些情景特定的报告,而不是一般的Turtle。
更通用但更困难的方法是使用约束测试系统(例如SHACL)来检查小图形(例如Turtle文件),并以某些方式显示/排序/验证它们。 SHACL有一个专门针对它的演示,而不仅仅是验证,这是它的主要用例。