如何在编写 rdf 三元组时为对象赋予数值

How to give a numeric value to an object while writing an rdf triple

我正在尝试为 MixedFruitJuice is made of 2 Oranges, 1 Pomegranate and 1 Pineapple

这里MixedFruitJuice是class的实例FruitJuiceOrangePomegranatePineappleFruit的实例.

我不明白如何为对象赋予数值。比如“2”个橙子,或“1”个石榴。

有多种方法可以实现这一点。例如,使用 OWL,您可以应用 owl:Restriction 来定义 rdfs:subClassowl:equivalentClass,这取决于您是否认为您的配方是必要的或充分必要条件一个MixedFruitJuice

我建议将 OrangePomegranatePineapple 声明为 Fruitrdfs:subClass。这样,如果按照配方由混凝土水果制成混凝土果汁,则可以 MixedFruitJuice。现在,假设必要但不充分的条件(毕竟他们也需要一些摇晃),:MixedFruitJuice 可以描述为:

:MixedFruitJuice rdf:type owl:Class ;
          rdfs:subClassOf [ owl:intersectionOf ( :Juice
                 [ rdf:type owl:Restriction ;
                 owl:onProperty :hasIngredient ;
                 owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
                 owl:onClass :Pineapple]
                 [ rdf:type owl:Restriction ;
                 owl:onProperty :hasIngredient ;
                 owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
                 owl:onClass :Pomegranate]
                 [ rdf:type owl:Restriction ;
                 owl:onProperty :hasIngredient ;
                 owl:qualifiedCardinality "2"^^xsd:nonNegativeInteger ;
                 owl:onClass :Orange]
                                                          ) ;
                                       rdf:type owl:Class
                                     ] .

除了OWL,在某些情况下也可以用SHACL来实现,带来更好的效果。

如果您想将 OrangePomegranatePineapple 作为实例而不是 Fruit 的子类,那么您可以考虑使用 RDF 具体化或 RDF* .

使用具体化会产生问题,无论如何有一种简单的方法来表示它,只使用 RDF,我在建议 OWL 之前就应该想到这一点。在这里:

:MixedFruitJuice
  rdf:type :Juice ;
  :isMadeOf [
      rdf:type :Orange ;
      :numberOfUnits "2"^^xsd:decimal ;
    ] ;
  :isMadeOf [
      rdf:type :Pineapple ;
      :numberOfUnits "1"^^xsd:decimal ;
    ] ;
  :isMadeOf [
      rdf:type :Pomegranate ;
      :numberOfUnits "1"^^xsd:decimal ;
    ] ;
.

对于 :numberOfUnits,我可以选择 xsd:int 范围,但我假设在果汁中可能需要 1.5 个苹果。