1

我正在开展一个项目,该项目要求我们使用现有的服务,它会说 json-ld。我们说 json。我仍在研究http://www.w3.org/TR/json-ld/文档以及如何转换 json > json-ld(并返回)。

一些问题..如果我提供 2 个这样的上下文..

"@context": [
        "http://example/test1/core.jsonld",
        "http://example2/test2/core.jsonld"
    ],

密钥如何知道要应用哪个前缀?例如

(test1 or test2)name : ..
(test1 or test2)date : ..
(test1 or test2)address : ..

到目前为止,我对它的工作原理的理解是,任何 json 都可以转换为 json ld。我们需要为它提供一个上下文,所以它知道“iri”或命名空间。

此外,我正在使用的当前示例 json-ld 也有一些没有定义前缀的键,所以我想有一个默认值,但没有任何东西可以告诉我默认值是什么(没有@vocab,实际上只是两个上下文定义)。我想默认值是一个上下文,但在这种情况下我有 2 个。

如果我错了,请纠正我,但所有 json 都可以转换为 json-ld ,反之亦然?我正在寻找 Java 解决方案 ATM。

我想要的一个非常基本的例子

{
    "id": 1,
    "name": "A green door",
    "price": 12.50,
}

成为

{
    @context{
     test : www.example.com/test/core.json-ld
     test2 : www.example.com/test2/core.json-ld
     }
    "id": 1,
    "test:name": "A green door",
    "test2:price": 12.50,
}

编辑:所以这是服务对我的期望的一个例子

{
    "@context": [
        "http://test.net/abcd/contexts/core.jsonld",
        "http://test.net/abcd/contexts/def/4.0/core.jsonld"
    ],

    "startDate": { "@value": "2009-11-21T22:17:10Z", "@type": "xsd:dateTime" },
    "endDate": { "@value": "2005-13-24T22:01:01Z", "@type": "xsd:dateTime" },
    "comment": "my comment",
    "example": [{
      "properties": {
        "name": "test name",
        "description": "test description",
        "geometry": { "objVal": "POINT (127.25 3.243)", "confidence": "abcd-c:MED" },
        "def:width": { "decimalVal" : 50, "units": "abcd-u:meters" },
        "def:length": { "decimalVal" : 75, "units": "abcd-u:meters" },
        "def:height": { "decimalVal" : 200, "units": "abcd-u:meters" },
        "def:status": "operational",
        "def:typeCode": "building"
      },
      "metadata": {
        "@id": "object/123-32132-12321f",
        "type": [ "def:Building" ],
        "def:confidence": { "@id": "abcd-c:HIGH" },
        "def:typeCode": "building"
      }
    }],
    "def:classification": "classified",
    "def:confidence": { "@id": "abcd-c:HIGH" },
    "def:indicator": { "@value": "true", "@type": "xsd:boolean" },
    "def:levelCode": { "@id": "def-cl:FULL" },
    "source": {
      "@id": "remote-store/12321fd-cdsf143221",
      "mediaType": "image/jpeg",
      "startDate": { "@value": "2001-11-11T12:02:02Z", "@type": "xsd:dateTime" },
      "def:classification": "classified",
      "def:producer": "ABC",
      "name": "another name",
      "describedby": "source/123123123-f21321f" 
    }
}

我当前的 json 当然看起来不像这样,我可以将它的结构类似,但我觉得如果我只需将 @context 添加到我当前的 json 并将其传递给服务,那就太容易了,因为它显示我期望什么。听起来我也许可以做到这一点,并让存在的服务读取带有注释的 json,与我提供的示例 json-ld 相同

4

1 回答 1

9

首先,根据定义,每个 JSON-LD 文档也是一个有效的 JSON 文档。

密钥如何知道要应用哪个前缀?

上下文按顺序进行评估。这意味着test2/core.jsonld您示例中的术语定义将覆盖test1/core.jsonld. 这在“高级上下文使用”部分的 JSON-LD 规范中有更详细的描述。

到目前为止,我对它的工作原理的理解是,任何 json 都可以转换为 json ld。我们需要为它提供一个上下文,所以它知道“iri”或命名空间。

对于大多数文件,这是正确的。有一些表单无法通过仅添加上下文来映射到合理的 JSON-LD。

此外,我正在使用的当前示例 json-ld 也有一些没有定义前缀的键,所以我想有一个默认值,但没有任何东西可以告诉我默认值是什么(没有@vocab,实际上只是两个上下文定义)。我想默认值是一个上下文,但在这种情况下我有 2 个。

弄清楚幕后发生的事情的最简单方法是使用JSON-LD 操场并展开文档。这摆脱了上下文并显示了处理器如何解释数据。展开文档时,未映射到 IRI 的术语将被忽略(即删除)。

编辑:

我当前的 json 当然看起来不像这样,我可以将它的结构类似,但我觉得如果我只需将 @context 添加到我当前的 json 并将其传递给服务,那就太容易了,因为它显示我期望什么。

这确实是最简单的解决方案。

我仍然对从 json 到 ld 的实际转换如何发生感到困惑。

JSON-LD 也只是 JSON。所以没有魔法......如果可以的话,最简单的事情就是把它变成其他服务所期望的形式。

我希望有某种类型的库,我只需向它提供我的 json 并给它一个上下文,它会为我进行转换吗?像这样的东西可用/可能吗?我的用例是....我从ui创建一个json对象,我将此json发送到调用服务的rest服务,在此服务中,我想在调用另一个只理解ld的服务之前将其转换为json ld。

这也是可能的,但可能更复杂。您需要调用 JSON-LD 处理器的compact 方法,并将expandContext选项设置为一个上下文,该上下文将您的键映射到正确的 IRI,并将上下文参数设置为其他服务期望的上下文。如果其他服务确实使用 JSON-LD,则不需要压缩它以使用相同的上下文。只需通过 expandContext 扩展它就足够了。

假设预先存在的服务为我提供了他们的上下文,例如 www.test.com,还需要做什么/提供什么?

没什么我猜

于 2015-01-22T00:01:31.803 回答