OWL rdfs: максимальная вместимость языковой строки для каждого языка

#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, которое является «лучшим» языком ограничений для данных RDF

3. @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, оставлена читателю в качестве упражнения.