在相同布局中使用serialize打印rdflib.Graph

问题描述

使用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有一个专门针对它的演示,而不仅仅是验证,这是它的主要用例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...