Как присвоить объекту значение цифра c при написании тройки rdf - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь написать тройной rdf для MixedFruitJuice is made of 2 Oranges, 1 Pomegranate and 1 Pineapple.

Здесь MixedFruitJuice является экземпляром класса FruitJuice, а Orange Pomegranate и Pineapple являются экземплярами Fruit.

Я не понимаю, как я могу дать числовое значение c для объектов. Как "2" апельсина или "1" гранат.

1 Ответ

2 голосов
/ 15 февраля 2020

Есть разные способы достичь этого. Например, используя OWL, вы можете применить owl:Restriction, чтобы определить либо rdfs:subClass, либо owl:equivalentClass, в зависимости от того, видите ли вы свой рецепт как необходимый, или как необходимые и достаточные условия для MixedFruitJuice.

Я бы предложил объявить Orange, Pomegranate и Pineapple как rdfs:subClass из Fruit. Таким образом, бетонный сок, если он изготовлен из конкретных фруктов по рецепту, может составлять 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 в некоторых случаи, приносящие лучшие результаты.

Если вы хотите сохранить Orange, Pomegranate и Pineapple в качестве экземпляров, а не в качестве подклассов Fruit, то вы можете рассмотреть возможность использования RDF-reification или RDF *.

Использование reification может создать проблемы, и в любом случае есть простой способ представить это, используя только 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 яблока.

...