使用两个不同的@types 压缩 JSON-LD 属性?

Compacting JSON-LD property w/ two different @types?

我正在尝试压缩 JSON-LD 文档,见下文(我们使用的是 URN,但 URL 也会出现同样的问题)。我希望在下面的两种用法中 "org:example:property:schema;2" 被压缩为 schema 模式的嵌套对象 属性 也被合理地压缩.遗憾的是,到目前为止这似乎是不可能的。

[
  {
    "@id": "org:example:ExampleThing",
    "org:example:property:contents;2": [
          {
        "@type": "org:example:class:Property;2",
        "org:example:property:schema;2": {
          "@id": "org:example:instance:Schema:integer;2"
        }
      }
    ]
  },
  {
    "@id": "org:example:ExampleThing2",
    "org:example:property:contents;2": [
      {
        "@type": "org:example:class:Property;2",
        "org:example:property:schema;2": {
            "@type": "org:example:class:Enum;2",
            "org:example:property:valueSchema;2": {
                "@id": "org:example:instance:Schema:string;2"
            }
        }
      }
    ]
  }
]

我想得到的是:

[
    {
      "@id": "org:example:ExampleThing",
      "contents": {
        "@type": "Property",
        "schema": {
          "@id": "integer"
        }
      }
    },
    {
      "@id": "org:example:ExampleThing2",
      "contents": {
        "@type": "Property",
        "schema": {
          "@type": "Enum",
          "valueSchema": "string"
        }
      }
    }
  ]

我得到的最接近的是以下上下文。但是,其中 org:example:instance:Schema:integer;2 而不是 按要求压缩。将 "@type": "@vocab" 添加到 schema 定义解决了 ExampleThing 的问题,但是 schema 术语与 ExampleThing2 中 属性 的用法不匹配, 所以它没有在那里被压缩。

{
  "Property": { "@id": "org:example:class:Property;2" },
  "Enum": { "@id": "org:example:class:Enum;2" },
  "contents": { "@id": "org:example:property:contents;2" },
  "schema": { "@id": "org:example:property:schema;2" },
  "valueSchema": {
      "@id": "org:example:property:valueSchema;2",
      "@type": "@vocab"
  },
  "integer": { "@id": "org:example:instance:Schema:integer;2" },
  "string": { "@id": "org:example:instance:Schema:string;2" }
}

您所拥有的与您想要的非常接近。您可以在此处查看 playground link

主要问题是 "org:example:instance:Schema:integer;2" @id 值无法进一步压缩,因为 @id 的值被视为相对于文档位置的 IRI,或者 @base。您可以在上下文中添加一个 @base 声明,这可以让您更接近。您可以使用范围上下文做得更好,并在 Propertyschema.

范围内的上下文中使用不同的 @base

如果不这样做,压缩结果如下所示:

{
  "@context": {
    "Property": {"@id": "org:example:class:Property;2"},
    "Enum": {"@id": "org:example:class:Enum;2"},
    "contents": {"@id": "org:example:property:contents;2"},
    "schema": {"@id": "org:example:property:schema;2"},
    "valueSchema": {
      "@id": "org:example:property:valueSchema;2",
      "@type": "@vocab"
    },
    "integer": {"@id": "org:example:instance:Schema:integer;2"},
    "string": {"@id": "org:example:instance:Schema:string;2"}
  },
  "@graph": [
    {
      "@id": "org:example:ExampleThing",
      "contents": {
        "@type": "Property",
        "schema": {
          "@id": "org:example:instance:Schema:integer;2"
        }
      }
    },
    {
      "@id": "org:example:ExampleThing2",
      "contents": {
        "@type": "Property",
        "schema": {
          "@type": "Enum",
          "valueSchema": "string"
        }
      }
    }
  ]
}

您可以在规范的 Shortening IRIs 部分阅读更多内容。