Как мне определить мои собственные ограниченные типы в RDF Vocab? - PullRequest
1 голос
/ 09 февраля 2020

Я бы хотел определить свои собственные ограниченные типы для моего собственного словаря RDF.

Например, если я хочу строку, которая не может быть длиннее 20 символов, я могу сделать что-то подобное с XSD в XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="Char_20">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="20"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Я обнаружил нечто похожее с аспектами OWL и XSD в черепахе:

:EquipmentCategoryName
    rdf:type owl:DatatypeProperty
    rdfs:domain :EquipmentCategory
    rdfs:range [
        rdf:type rdfs:Datatype
        owl:onDatatype xsd:string
        owl:withRestrictions (
            [
                xsd:maxLength "10"^^xsd:int
            ]
        )
    ]

В теории я мог бы даже использовать my:Char_20 rdfs:subClassOf xsd:string для описания моего ограниченного типа, но Я думаю, это не будет стандартным решением.

Я проверил schema.org, и это стало полной неожиданностью. https://schema.org/version/6.0/schema.jsonld Они добавляют XSD к контексту, но они даже не удосуживаются определить какие-либо типы на основе примитивов XSD или дать диапазон XSD должным образом. И это голос, который все используют.

Так что я вижу полный хаос в этой области. Есть ли стандартное или рекомендуемое решение для определения моих собственных ограниченных типов?

1 Ответ

0 голосов
/ 10 февраля 2020

Я проверил много словарей здесь: https://github.com/ruby-rdf/rdf-vocab/ и на разных страницах и узнал больше о OWL на сайтах W3 C. Оказалось, что мы можем использовать примитивы XSD, как и классы RDF. Типичное использование:

по свойствам

Y rdf:type rdfs:Class
x rdf:type rdfs:Property
x rdfs:range xsd:integer
x rdfs:domain Y

y rdf:type Y
y x 12

по переменным

x rdf:type xsd:integer
x rdf:value 12

Чтобы сначала ограничить целое число диапазоном 0-100, нам нужно определить ограничение. Это сложно, потому что мы также должны определить диапазон:

r rdf:type owl:Restriction
r owl:allValuesFrom s
s rdf:type owl:DataRange
s rdf:onDataRange xsd:integer
s xsd:minInclusive 0
s xsd:maxInclusive 100

Если мы хотим применить ограничение к нашей собственности, нам нужно сделать следующее

x rdf:type owl:DatatypeProperty
r owl:onProperty x
r owl:onClass Y

Если мы хотим применить его к нашей переменной, которая является другой строкой. Я не совсем уверен в этом, но я думаю, что мы можем определить пользовательский тип ограниченного примитива следующим образом:

xsd:integer rdf:type rdfs:Datatype

X rdf:type rdfs:Datatype
X rdfs:subClassOf xsd:integer
r owl:onDatatype X

После того, как у нас есть новый тип, мы просто используем его для переменной:

x rdf:type X
x rdf:value 12

Если это так, мы можем использовать тот же подход для свойства:

Y rdf:type rdfs:Class
x rdf:type rdfs:Property
x rdfs:range X
x rdfs:domain Y

y rdf:type Y
y x 12
...