как связать индивида с комбинацией индивидов?

У меня есть онтология, содержащая растения и болезни, а также свойство treat (болезни растений treat). У меня много растений и болезней, но теперь я хочу добавить болезнь, которая лечится комбинацией двух или более растений. Например, как я могу представить следующее предложение?

Болезнь X поддается лечению комбинацией растения А и растения В, но не растением А или растением В по отдельности.

Я думал получить это с помощью резона, но я понятия не имею, как это сделать.


person Alexandrina Sbiera    schedule 23.06.2013    source источник
comment
Большое спасибо Джошуа. Мне очень помогает.   -  person Alexandrina Sbiera    schedule 27.06.2013
comment
Рад это слышать! Если это сработало для вас, вы можете отметить его как принятое, чтобы другие пользователи знали, что это сработало для вас (и вознаградить отвечающего небольшим количеством репутации).   -  person Joshua Taylor    schedule 27.06.2013


Ответы (2)


Похоже, на данный момент у вас есть онтология с классами Disease и Plant и свойство treats с доменом Plant и диапазоном Disease. Насколько я понимаю, проблема в том, что некоторые Disease должны обрабатываться не отдельными Plant, а скорее их комбинациями. В этих случаях мы могли бы сказать, что растение используется для лечения болезни, но само по себе не лечит болезнь. Вероятно, разумно также сказать, что если растение само по себе лечит болезнь, то оно и используется для лечения болезни.

Итак, у вас есть класс особей, который вы раньше не рассматривали, то есть комбинации растений, так почему бы не ввести класс PlantCombination и свойство hasComponent, которое связывает PlantCombination с растениями в комбинации? Вы также можете добавить ограничение, говорящее, что в каждой комбинации растений есть как минимум два растения, если хотите, сказав PlantCombination SubClassOf hasComponent min 2 Plant. Так как и Plants, и PlantCombinations могут работать с Diseases, вы захотите изменить домен treats на Plant or PlantCombination. Чтобы гарантировать, что рассуждающий может сделать вывод о том, что если plant82 treats disease92 то plant82 isUsedToTreat disease92, вы можете утверждать, что treats SubPropertyOf isUsedToTreat. (Это также будет означать, что комбинация растений, которая лечит болезнь, также используется для лечения этой болезни.) Чтобы гарантировать, что когда комбинация с компонентом растение23 лечит заболевание, это растение23 используется для лечения болезни, можно добавить утверждение, что inverse(hasComponent) o treats SubPropertyOf isUsedToTreat. Вот онтология, которая делает именно это:

Формат N3

@prefix :        <http://www.example.org/plantsAndDiseases#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://www.example.org/plantsAndDiseases>
      a       owl:Ontology .

:Plant
      a       owl:Class .

:Disease
      a       owl:Class .

:PlantCombination
      a       owl:Class ;
      rdfs:subClassOf
              [ a       owl:Restriction ;
                owl:minQualifiedCardinality
                        "2"^^xsd:nonNegativeInteger ;
                owl:onClass :Plant ;
                owl:onProperty :hasComponent
              ] .

:hasComponent
      a       owl:ObjectProperty ;
      rdfs:domain :PlantCombination ;
      rdfs:range :Plant .

:isUsedToTreat
      a       owl:ObjectProperty ;
      rdfs:comment "X isUsedToTreat Y means that X is used in the treatment of Y.  X may either treat Y, or may be a component of a combination that treats Y." ;
      rdfs:domain
              [ a       owl:Class ;
                owl:unionOf (:Plant :PlantCombination)
              ] ;
      rdfs:range :Disease ;
      owl:propertyChainAxiom
              ([ owl:inverseOf :hasComponent
                ] :treats) .

:treats
      a       owl:ObjectProperty ;
      rdfs:comment "X treats Y means that X is a sufficient treatment for Y." ;
      rdfs:domain
              [ a       owl:Class ;
                owl:unionOf (:Plant :PlantCombination)
              ] ;
      rdfs:range :Disease ;
      rdfs:subPropertyOf :isUsedToTreat .

Функциональный синтаксис OWL

Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
Prefix(xml:=<http://www.w3.org/XML/1998/namespace>)
Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)

Ontology(<http://www.example.org/plantsAndDiseases>

Declaration(Class(<http://www.example.org/plantsAndDiseases#Disease>))
Declaration(Class(<http://www.example.org/plantsAndDiseases#Plant>))
Declaration(Class(<http://www.example.org/plantsAndDiseases#PlantCombination>))
SubClassOf(<http://www.example.org/plantsAndDiseases#PlantCombination> ObjectMinCardinality(2 <http://www.example.org/plantsAndDiseases#hasComponent> <http://www.example.org/plantsAndDiseases#Plant>))
Declaration(ObjectProperty(<http://www.example.org/plantsAndDiseases#hasComponent>))
ObjectPropertyDomain(<http://www.example.org/plantsAndDiseases#hasComponent> <http://www.example.org/plantsAndDiseases#PlantCombination>)
ObjectPropertyRange(<http://www.example.org/plantsAndDiseases#hasComponent> <http://www.example.org/plantsAndDiseases#Plant>)
Declaration(ObjectProperty(<http://www.example.org/plantsAndDiseases#isUsedToTreat>))
AnnotationAssertion(rdfs:comment <http://www.example.org/plantsAndDiseases#isUsedToTreat> "X isUsedToTreat Y means that X is used in the treatment of Y.  X may either treat Y, or may be a component of a combination that treats Y.")
ObjectPropertyDomain(<http://www.example.org/plantsAndDiseases#isUsedToTreat> ObjectUnionOf(<http://www.example.org/plantsAndDiseases#PlantCombination> <http://www.example.org/plantsAndDiseases#Plant>))
ObjectPropertyRange(<http://www.example.org/plantsAndDiseases#isUsedToTreat> <http://www.example.org/plantsAndDiseases#Disease>)
Declaration(ObjectProperty(<http://www.example.org/plantsAndDiseases#treats>))
AnnotationAssertion(rdfs:comment <http://www.example.org/plantsAndDiseases#treats> "X treats Y means that X is a sufficient treatment for Y.")
SubObjectPropertyOf(<http://www.example.org/plantsAndDiseases#treats> <http://www.example.org/plantsAndDiseases#isUsedToTreat>)
ObjectPropertyDomain(<http://www.example.org/plantsAndDiseases#treats> ObjectUnionOf(<http://www.example.org/plantsAndDiseases#PlantCombination> <http://www.example.org/plantsAndDiseases#Plant>))
ObjectPropertyRange(<http://www.example.org/plantsAndDiseases#treats> <http://www.example.org/plantsAndDiseases#Disease>)
SubObjectPropertyOf(ObjectPropertyChain(ObjectInverseOf(<http://www.example.org/plantsAndDiseases#hasComponent>) <http://www.example.org/plantsAndDiseases#treats>) <http://www.example.org/plantsAndDiseases#isUsedToTreat>)
)
person Joshua Taylor    schedule 23.06.2013

Альтернатива ответу Джошуа: вы можете представлять болезни и растения как классы OWL, так как здесь вы ссылаетесь на наборы растений (не конкретные экземпляры, которые вы встретите в природе). Затем вы можете связать классы с экзистенциальными ограничениями (some — распространенный шаблон в биологии).

Вам также необходимо ввести дополнительный шаг в ваше моделирование, как уже упоминалось: растения могут быть, например, ингредиентами лечения, болезни, которые можно лечить с помощью лечения.

Затем, если вы рассмотрите следующую прокомментированную (#) онтологию (синтаксис Манчестера), я опишу аксиомы для моделирования. Вы можете сохранить файл и открыть его с помощью Protege.

Prefix: xsd: <http://www.w3.org/2001/XMLSchema#>
Prefix: owl: <http://www.w3.org/2002/07/owl#>
Prefix: : <http://www.example.org/demo.owl#>
Prefix: xml: <http://www.w3.org/XML/1998/namespace>
Prefix: rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Prefix: rdfs: <http://www.w3.org/2000/01/rdf-schema#>

Ontology: <http://www.example.org/demo.owl>

ObjectProperty: has-ingredient

ObjectProperty: treatableBy

Class: owl:Thing

Class: PlantA
  SubClassOf: 
    Plant

Class: Treatment

#Your treatment obtained by mixing some 
#of the plant B and some of the plant A
Class: TreatmentAB
  SubClassOf: 
    Treatment,
    (has-ingredient some PlantA)
     and (has-ingredient some PlantB)

Class: PlantB
  SubClassOf: 
    Plant

#This treatment has ingredient the plant A
Class: TreatmentA
  SubClassOf: 
    has-ingredient some PlantA,
    Treatment

#This treatment is made from plant B (among other things) 
Class: TreatmentB
  SubClassOf: 
    Treatment,
    has-ingredient some PlantB

Class: Disease

Class: Plant

# This disease is treatable by the TreatmentAB
Class: DiseaseA
  SubClassOf: 
    treatableBy some TreatmentAB,
    Disease

Class: DiseaseB
  SubClassOf: 
    treatableBy some TreatmentB,
    Disease

Теперь, если бы мы рассуждали об онтологии и запрашивали подклассы treatableBy some TreatmentA, мы бы не получили никакого класса. Выражение treatableBy some TreatmentAB возвращает DiseaseA, как и ожидалось.

person loopasam    schedule 23.06.2013