#rdf #owl #semantic-web #ontology #rdfs
#rdf #owl #семантическая сеть #онтология #rdfs
Вопрос:
Возможно ли в OWL иметь ограничение максимальной мощности для языкового свойства, которое ограничивало бы мощность для каждого языка.
Например, мне нужен не более одного dct:title
для каждого языка. Итак,
:demo dct:title "Demo"@en, "Demo"@nl.
было бы неплохо, но
:bad_demo dct:title "Bad demo"@en, "Wrong demo"@en.
выдаст ошибку?
Комментарии:
1. «для каждого языка» в OWL невозможно, поскольку у вас нет доступа к тегу language.
2. вы можете использовать SPARQL для получения нарушений:
select ?s ?lang (group_concat(?o; separator = "; ") as ?values) { ?s dct:title ?o BIND(lang(?o) as ?lang) } group by ?s ?lang having (count(?o) > 1)
— и, возможно, поместить это в правило SHACL, которое является «лучшим» языком ограничений для данных RDF3. @AKSW: На самом деле, ограничение можно выразить в семантике OWL 2, основанной на RDF. Однако для ее принудительного применения вам понадобится очень специальный разработчик.
4. @AntoineZimmermann ну, честно говоря, я предполагал написать общее утверждение. Я знаю, что это возможно сделать для определенного языка, но кто хочет перечислять одно и то же ограничение диапазона данных для всех возможных языковых тегов? Я всегда думаю о OWL 2 DL, поскольку я не знаю ни о каком OWL Full reasoner (да, вы могли бы переписать в FOL и использовать reasoner для FOL, но кому это нужно?). И для меня OWL не является языком ограничений, поэтому в настоящее время я бы в основном предложил использовать SHACL для данных RDF, если вы действительно хотите определить и проверить ограничение.
5. Я поддержу ваш ответ (при оценке ваших усилий) и прошу прощения за мое общее утверждение о том, что оно не работает в OWL. В моих следующих заявлениях должно быть более точным.
Ответ №1:
Частично это можно сделать в OWL 2 DL. Однако вам пришлось бы добавить ограничение мощности для каждого используемого вами языка. В OWL 2 DL у вас не может быть общей аксиомы, которая работала бы для всех возможных языков. В синтаксисе черепахи:
@base <http://example.com/>.
@prefix dct: <http://purl.org/dc/terms/>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
<> a owl:Ontology;
rdfs:comment "An ontology with cardinality restrictions on some languages."@en .
<ThingWithTitle> a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty dct:title;
owl:maxQualifiedCardinality 1;
owl:onDataRange [
a rdfs:Datatype;
owl:onDatatype rdf:plainLiteral;
owl:withRestrictions ([rdf:langRange "en"])
]
], [
a owl:Restriction;
owl:onProperty dct:title;
owl:maxQualifiedCardinality 1;
owl:onDataRange [
a rdfs:Datatype;
owl:onDatatype rdf:plainLiteral;
owl:withRestrictions ([rdf:langRange "nl"])
]
], [
# ...
# same for de, es, fr, it, zh, etc.
# ...
]
].
С этой онтологией следующее было бы несовместимым:
<doc1> a <ThingWithTitle>;
dct:title "Title"@en, "Another title"@en-UK .
Вы могли бы быть более конкретными и разрешить несколько названий на английском / голландском языках, если они не на одном диалекте. Просто замените rdf:langRange "en"
на rdf:langRange "en-UK"
и т.д.
В OWL 2 Full вы можете выразить это обобщенно (то есть для всех языков), но это ужасно сложно, и на Земле нет специалиста по рассуждениям, который мог бы справиться с этим типом рассуждений, так что лучше не пытаться, если только вам не нравятся академические задачи ради интеллектуальной мастурбации.
Редактировать:
После некоторой интенсивной мысленной мастурбации я пришел к следующему:
[
owl:onDatatype xsd:string;
owl:withRestrictions (
[
xsd:pattern "...regular_expression_for_an_extended_language_range_from_rfc_4647..."
]
)
] rdfs:subClassOf [
owl:onProperty [owl:inverseOf rdf:langRange];
owl:someValuesFrom [
owl:onProperty [owl:inverseOf rdf:first];
owl:someValuesFrom [
owl:onProperty [owl:inverseOf owl:withRestrictions];
owl:someValuesFrom [
owl:intersectionOf (
[
owl:onProperty owl:onDatatype;
owl:hasValue rdf:plainLiteral
], [
owl:onProperty [owl:inverseOf owl:onDataRange];
owl:someValuesFrom [
owl:intersectionOf (
[
owl:onProperty owl:maxQualifiedCardinality;
owl:hasValue 1
], [
owl:onProperty owl:onProperty;
owl:hasValue dct:title
], [
owl:onProperty [owl:inverseOf rdfs:subClassOf];
owl:hasValue <ThingWithTitle>
]
)
]
]
)
]
]
]
] .
Проверка того, что это работает в рамках семантики на основе RDF, основанной на OWL 2, оставлена читателю в качестве упражнения.