Вы можете частично сделать это в OWL 2 DL.Однако вам придется добавить ограничение количества элементов для каждого используемого вами языка.В OWL 2 DL не может быть общей аксиомы, которая работала бы для всех возможных языков.В синтаксисе Turtle:
@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>
]
)
]
]
)
]
]
]
] .
Проверка того, что это работает в семантике OWL 2 на основе RDF , оставлено читателю в качестве упражнения.