每种语言的OWL rdfs:langString maxCardinality

时间:2019-03-18 10:11:31

标签: rdf owl semantic-web ontology rdfs

OWL是否有可能对语言属性设置最大基数限制,从而限制每种语言的基数。

例如,我只希望每种语言最多dct:title个。因此,

:demo dct:title "Demo"@en, "Demo"@nl.

可以,但是

:bad_demo dct:title "Bad demo"@en, "Wrong demo"@en.

会给出错误吗?

1 个答案:

答案 0 :(得分:7)

您可以在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>
                ]
              )
            ]
          ]
        )
      ]
    ]
  ]
] .

作为练习供读者阅读。