JSON-LD框架规定了rdfs的顺序


@prefix emp: <http://example.com/employee/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
emp:hasName rdf:type rdfs:Property .
emp:dateOfBirth  rdf:type rdfs:Property ;
rdf:after emp:passportNumber .
emp:passportNumber rdf:type rdfs:Property .

给定上面的Turtle RDF模型,我想生成以下JSON-LD:

"@graph": [
{
"@id": "emp:hasName",
"@type": "rdfs:Property"
},
{
"@id": "emp:passportNumber",
"@type": "rdfs:Property"
},
{
"@id": "emp:dateOfBirth",
"@type": "rdfs:Property",
}
]

请注意,emp:dateOfBirth在列表中的emp:passportNumber之后排序,因为我在模型中指定了rdf:after "emp:passportNumber"

如何通过JSON-LD Framing实现这一点?

依赖于这些RDF在中声明的顺序是否安全,因为大多数RDF->JSON-LD库似乎保留了排序(尽管规范将其定义为无序(?

我不想在RDF模型中明确定义一个详尽的有序列表,因为该列表将是巨大的,并且只需要对少数RDF进行排序(例如,我不在乎emp:hasName在哪里(。

JSON-LD算法将选择性地对对象中的键进行排序,而不是对对象本身进行排序。可以做到这一点的一种方法是使用id映射,这样不同RDFS术语的主题IRI就可以用作该映射的密钥。为此,它们都需要成为其他实体的价值。这样做的一个技巧是使用rdfs:isDefinedBy作为反向属性,这样本体本身就显示为与它定义的术语具有反向关系的顶级对象。将reverse属性与id映射相结合将使对象值具有主题IRI作为关键字,然后可以对其进行排序。

您看到一个"订单;JSON-LD中的三元组中的一个只是序列化的产物,您也可以在RDF/XML(XML元素是有序的(和Turtle(文本文件也是有序的(中看到这一点,但它并不是稳定的依赖。在转换为另一种格式之前,实现可以非常容易地使用哈希集来存储三元组,并且可以根据需要重新排列三元组。

现在,JSON-LD Framing似乎用于生成压缩的JSON文档,而不是扁平化(即使用@graph(,但如果它可以双向使用,我认为这应该有效:

{
"@context": ...,
"@graph": [
{
"@id": "emp:passportNumber"
},
{
"@id": "emp:dateOfBirth"
}
]
}

假设你能接受单一的全球订单。然而,该规范中没有任何内容可以让您在RDF本身中指示顺序。

如果您出于演示的目的需要这样做,我建议您尽可能长时间地保留RDF本身中的排序关系。由于似乎没有rdf:after,您可以使用类似xhv:prev的东西来实现通用目的,或者根据上下文使用更具体的东西。您也可以使用SPARQL根据该属性对数据进行排序,因为SPARQL结果是有序的。

最新更新