Определить JSON-LD @context для объединения/разделения значений?

Я хочу использовать методы expand и compact библиотеки jsonld.js для преобразования данных из различных источников в общий формат для обработки. Если я возьму исходный документ JSON, добавлю к нему @context, а затем передам его через метод expand, я смогу получить нужный мне общий формат.

Вариант использования, для которого я не смог найти решение, — это когда необходимо объединить несколько значений. Например, schema.org определяет PostalAddress с одним полем для streetAddress, но многие системы хранят почтовый адрес как отдельные значения (номер улицы, название улицы, направление улицы...). Чтобы преобразовать входящие данные в формат schema.org, мне нужен способ указать в моем @context, что несколько полей составляют streetAddress в правильном порядке.

Сжатый документ

{
    "@context": {
        "displaName": "http://schema.org/name",
        "website": "http://schema.org/homepage",
        "icon": "http://schema.org/image",
        "streetNumber": "http://schema.org/streetAddress"
    },
    "displaName": "John Doe",
    "website": "http://example.com/",
    "icon": "http://example.com/images/test.png",
    "streetNumber": "123",
    "streetName": "Main St",
    "streetDirection": "South"
}

Расширенный документ

{
   "http://schema.org/name":[
      {
         "@value":"John Doe"
      }
   ],
   "http://schema.org/image":[
      {
         "@value":"http://example.com/images/test.png"
      }
   ],
   "http://schema.org/streetAddress":[
      {
         "@value":"123"
      }
   ],
   "http://schema.org/homepage":[
      {
         "@value":"http://example.com/"
      }
   ]
}

Я просмотрел все спецификации JSON-LD, которые мне удалось найти, и не смог найти ничего, что указывало бы на способ разделения или объединения значений с помощью @context.

Кто-нибудь знает способ сопоставить несколько значений в одно свойство контекста в правильном порядке и, возможно, добавить пробел между значениями. Мне также нужно найти решение для обратного сценария, когда мне нужно разбить одно поле на несколько значений в правильном порядке.

Примечание. Даже если я сопоставлю все три свойства с streetAddress, все значения будут включены в массив, но нет гарантии, что они будут в правильном порядке.


person Brian Shamblen    schedule 21.10.2015    source источник


Ответы (2)


Один из возможных способов добиться этого — использовать одно поле массива для вашего адреса, содержащее упорядоченные компоненты адреса (например, ["number", "direction", "name"]). Затем в @context вы можете указать address с @container: @list, что обеспечит правильный порядок компонентов адреса.

Таким образом, сжатый документ будет:

{
    "@context": {
        "displaName": "http://schema.org/name",
        "website": "http://schema.org/homepage",
        "icon": "http://schema.org/image",
        "address": {
          "@id": "http://schema.org/streetAddress",
          "@container": "@list"
        }
    },
    "displaName": "John Doe",
    "website": "http://example.com/",
    "icon": "http://example.com/images/test.png",
    "address": ["123", "South", "Main St"]
}

И расширенный будет

  {
    "http://schema.org/streetAddress": [
      {
        "@list": [
          {
            "@value": "123"
          },
          {
            "@value": "South"
          },
          {
            "@value": "Main St"
          }
        ]
      }
    ],
    "http://schema.org/name": [
      {
        "@value": "John Doe"
      }
    ],
    "http://schema.org/image": [
      {
        "@value": "http://example.com/images/test.png"
      }
    ],
    "http://schema.org/homepage": [
      {
        "@value": "http://example.com/"
      }
    ]
  }
person Val    schedule 25.10.2015
comment
Спасибо за ответ. К сожалению, мне нужно сохранить исходный документ в неприкосновенности. Цель вопроса - найти способ обработки перевода с использованием контекста, предполагая, что я не тот, кто предоставляет входные данные. - person Brian Shamblen; 25.10.2015
comment
Хорошо, я вижу, извините за недоразумение. Я мог бы знать другой способ, позвольте мне проверить. Несмотря на то, что поля должны оставаться нетронутыми, есть ли у вас полный контроль над @context? - person Val; 25.10.2015
comment
Да. Я пытаюсь создать способ, позволяющий пользователям отображать выходные данные API в общий формат. У меня уже есть работающий пользовательский интерфейс для обеспечения сопоставления один к одному, но я не смог выяснить из документации процессора json-ld, как манипулировать данными в исходном документе, помимо сопоставления ключей с их соответствующим словарем. - person Brian Shamblen; 25.10.2015

Я разместил проблему в репозитории jsonld.js Github. По словам @dlongley, первоначального создателя библиотеки jsonld.js, в этом поместье невозможно манипулировать свойствами, используя стандартный JSON-LD.

https://github.com/digitalbazaar/jsonld.js/issues/115

person Brian Shamblen    schedule 30.10.2015