@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结果是有序的。