Предоставление @type в @context для значения - PullRequest
0 голосов
/ 01 мая 2020

У меня есть следующий json -документ:

{
     "@context": {
        "ex": "http://example.com/",
        "yyyy": "ex:yyyy",
        "name": "ex:name",
        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
        "sch": "http://schema.org/",
        "xml": "http://www.w3.org/XML/1998/namespace",
        "xsd": "http://www.w3.org/2001/XMLSchema#"
    },
    "@id": "ex:Bobe",
    "@type": "ex:MyType",
    "yyyy": {
        "@type": "ex:XXXX",
        "name": "my name"
    }
}

Представление RDF:

@prefix ex: <http://example.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sch: <http://schema.org/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:Bobe a ex:MyType ;
    ex:yyyy [ a ex:XXXX ;
            ex:name "my name" ] .

Я хотел бы иметь возможность написать "yyyy": { ... } as

"yyyy": {
    "name": "my name"
}

и в параметре @context указано "@type": "ex:XXXX".

Возможно ли это?

Что я пробовал, но не ожидал, что будет работать:

{
    "@context": {
        "ex": "http://example.com/",
        "yyyy": {
            "@id": "ex:yyyy",
            "@type": "ex:XXXX"
        },
        "name": "ex:name",
        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
        "sch": "http://schema.org/",
        "xml": "http://www.w3.org/XML/1998/namespace",
        "xsd": "http://www.w3.org/2001/XMLSchema#"
    },
    "@id": "ex:Bobe",
    "@type": "ex:MyType",
    "yyyy": {
        "name": "my name"
    }
}

, и это имеет представление RDF:

@prefix ex: <http://example.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sch: <http://schema.org/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:Bobe a ex:MyType ;
    ex:yyyy [ ex:name "my name" ] .

Представление N-Quad на JSON - LD Playground - это:

<http://example.com/Bobe> <http://example.com/yyyy> _:b0 .
<http://example.com/Bobe> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/MyType> .
_:b0 <http://example.com/name> "my name" .

Таким образом, информация "@type" потеряна.

Конечно, она должна работать в ситуации, когда у меня было:

{
    "@context": {
        "ex": "http://example.com/",
        "yyyy": {
            "@id": "ex:yyyy",
            "@type": "ex:XXXX"
        },
        "name": "ex:name",
        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
        "sch": "http://schema.org/",
        "xml": "http://www.w3.org/XML/1998/namespace",
        "xsd": "http://www.w3.org/2001/XMLSchema#"
    },
    "@id": "ex:Bobe",
    "@type": "ex:MyType",
    "yyyy": [ { "name": "my name" },
              { "name": "my other" } ]
}

Я думаю, что это невозможно, но хотел бы подтвердить.

Код python, обычно используемый для генерации этого вывода:

graph_data = """
{
    "@id": "ex:Bobe",
    "@type": "ex:MyType",
    "@context": {
        "ex": "http://example.com/",
        "yyyy": "ex:yyyy",
        "name": "ex:name",
        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
        "sch": "http://schema.org/",
        "xml": "http://www.w3.org/XML/1998/namespace",
        "xsd": "http://www.w3.org/2001/XMLSchema#"
    },
    "yyyy": {
        "@type": "ex:XXXX",
        "name": "my name"
    }
}
"""

print( graph_data )

data  = rdflib.Graph().parse( data = graph_data, format = 'json-ld' )
print( f"{data.serialize( format = 'ttl' ).decode( 'utf8' )}" )

1 Ответ

1 голос
/ 10 мая 2020

Из https://www.w3.org/TR/json-ld11/#context -определений :

"Определение контекста ДОЛЖНО быть картой, ключи которой ДОЛЖНЫ быть либо терминами, компактными IRI, IRI или одним из ключевых слов @base, @import, @language, @propagate, @protected, @type, @version или @vocab. "

Так что @context на самом деле ничего не знает о вложенной информации, поскольку она у вас есть с

"yyyy": {
    "@id": "ex:yyyy",
    "@type": "ex:XXXX"
},

@context нельзя использовать для структуры , просто управление пространством имен

...