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" .
Есть ли у кого-нибудь совет, как интерпретировать разницу? Благодарю.
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.