Есть разные способы достичь этого. Например, используя 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 яблока.