Сжатие свойства JSON-LD с двумя разными @types?

#rdf #json-ld

#rdf #json-ld

Вопрос:

Я пытаюсь выполнить сжатие в документе JSON-LD, смотрите Ниже (мы используем URNS, но та же проблема возникает с URL-адресами). Я хочу, "org:example:property:schema;2" чтобы оно было сжато до schema в обоих приведенных ниже вариантах использования, и вложенные объекты свойства 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" }
}
  

Ответ №1:

То, что у вас есть, довольно близко к тому, что вы хотите. Вы можете проверить ссылку на игровую площадку здесь.

Основная проблема заключается в том, что "org:example:instance:Schema:integer;2" @id значение не может быть сжато дальше, поскольку значения @id обрабатываются как IRIs относительно местоположения документа или @base . Вы могли бы добавить @base объявление в контекст, что могло бы вас несколько приблизить. Вы могли бы добиться большего успеха, используя контексты с ограниченной областью действия, и использовать другое @base в контексте, ограниченном либо Property , либо schema .

Без этого результат сжатия выглядит следующим образом:

 {
  "@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"
        }
      }
    }
  ]
}
  

Вы можете прочитать больше в разделе спецификации о сокращении IRIs.

Комментарии:

1. Спасибо! К сожалению, я не могу достичь того, чего хотел бы здесь, но, думаю, мне придется обойтись.