JSON-LD @id с IRI приводит к пустому узлу

У меня есть небольшой файл JSON, размещенный на локальном веб-сервере, со следующим содержимым:

json_source = {"key1": "azerty", "key2": "qwerty", "key3": "lorem", "key4": "ipsum"}

Используя библиотеку RDFLib, я разбираю JSON, добавляю некоторую семантику с использованием контекста и сериализую в N-Triples:

from rdflib import Graph

context ={"@id": "http://example.org/test",
          "@context": {"dct": "http://purl.org/dc/terms/",
                       "foaf": "http://xmlns.com/foaf/0.1/",
                       "key1": {"@id": "dct:language"},
                       "key2": {"@id": "dct:title"},
                       "key3": {"@id": "dct:title"},
                       "key4": {"@id": "foaf:name"}
           }
 }

g = Graph()
rdf = g.parse('http://localhost/test.json', format='json-ld', context=context)

print rdf.serialize(format="nt")

На выходе получаются пустые узлы:

_:N6dc3aa6a68e34c36beade27af204cb6c <http://purl.org/dc/terms/language> "azerty" .
_:N6dc3aa6a68e34c36beade27af204cb6c <http://purl.org/dc/terms/title> "qwerty" .
_:N6dc3aa6a68e34c36beade27af204cb6c <http://xmlns.com/foaf/0.1/name> "ipsum" .
_:N6dc3aa6a68e34c36beade27af204cb6c <http://purl.org/dc/terms/title> "lorem" .

Почему-то @id не преобразовался в http://example.org/test.

Однако при добавлении JSON-LD на JSON-LD Playground как:

{
   "@id": "http://example.org/test",
   "@context": {
   "dct": "http://purl.org/dc/terms/",
   "foaf": "http://xmlns.com/foaf/0.1/",
   "key1": {"@id": "dct:language"},
   "key2": {"@id": "dct:title"},
   "key3": {"@id": "dct:title"},
   "key4": {"@id": "foaf:name"}
},
"key1": "azerty",
"key2": "qwerty",
"key3": "lorem",
"key4": "ipsum"

}

... он решает:

<http://example.org/test> <http://purl.org/dc/terms/language> "azerty" .
<http://example.org/test> <http://purl.org/dc/terms/title> "lorem" .
<http://example.org/test> <http://purl.org/dc/terms/title> "qwerty" .
<http://example.org/test> <http://xmlns.com/foaf/0.1/name> "ipsum" .

Есть ли у кого-нибудь совет, как интерпретировать разницу? Спасибо.


person Brainlock    schedule 28.07.2015    source источник


Ответы (1)


Проблема в том, что контекст, который вы передаете в rdflib, содержит не только контекст (@context), но и @id. Однако этот метод игнорирует все, кроме контекста, что, кстати, правильно. Причина, по которой это работает на игровой площадке JSON-LD, заключается в том, что вы добавляете свойство @id в тело документа, а не в контекст. Это становится понятно, когда документ, который вы передаете на площадку, печатается так:

{
  "@context": {
    "dct": "http://purl.org/dc/terms/",
    "foaf": "http://xmlns.com/foaf/0.1/",
    "key1": { "@id": "dct:language" },
    "key2": { "@id": "dct:title" },
    "key3": { "@id": "dct:title" },
    "key4": { "@id": "foaf:name" }
  },
  "@id": "http://example.org/test",  <------------- part of the body, not the context
  "key1": "azerty",
  "key2": "qwerty",
  "key3": "lorem",
  "key4": "ipsum"
}

Если вы добавите @id к test.json, это будет работать и для RDFlib.

person Markus Lanthaler    schedule 28.07.2015
comment
Спасибо за уточнение. Имеет смысл. Единственное решение, которое я могу придумать, - это поместить исходные данные в объект JSON и изменить содержимое, добавив идентификатор @id, поскольку я не смогу изменить исходный файл JSON на веб-сервере. - person Brainlock; 29.07.2015