Запрос на определение количества конкретных членов в нескольких классах, связанных вместе с множителем

Я сделал упрощенный пример моей онтологии в формате RDF/XML. Это в конце вопроса. Я работаю с Protégé 5.0 beta.

Картинка, которая объясняет мою просьбу:

Подводя итог коротко:

  • два уровня 1 класс: процесс, продукты

  • три подкласса процесса: процесс_1, процесс_2, процесс_3

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

  • у каждого члена process_n есть свойство данных, называемое количеством.

Если бы вы могли помочь мне с синтаксисом, это было бы неплохо, но в основном это из-за того, что мне нужна помощь.

Онтология (RDF/XML)

<?xml version="1.0"?>


<!DOCTYPE rdf:RDF [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
<!ENTITY untitled-ontology-14 "http://www.semanticweb.org/francocy/ontologies/2015/1/untitled-ontology-14#" >
]>


<rdf:RDF xmlns="http://www.semanticweb.org/francocy/ontologies/2015/1/untitled-ontology-14#"
 xml:base="http://www.semanticweb.org/francocy/ontologies/2015/1/untitled-ontology-14"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:owl="http://www.w3.org/2002/07/owl#"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
 xmlns:untitled-ontology-14="http://www.semanticweb.org/francocy/ontologies/2015/1/untitled-ontology-14#"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="http://www.semanticweb.org/francocy/ontologies/2015/1/untitled-ontology-14"/>

<owl:ObjectProperty rdf:about="&untitled-ontology-14;input"/>

<owl:ObjectProperty rdf:about="&untitled-ontology-14;output">
    <rdf:type rdf:resource="&owl;FunctionalProperty"/>
</owl:ObjectProperty>

<owl:DatatypeProperty rdf:about="&untitled-ontology-14;quantity"/>

<owl:Class rdf:about="&untitled-ontology-14;process"/>

<owl:Class rdf:about="&untitled-ontology-14;process_1">
    <rdfs:subClassOf rdf:resource="&untitled-ontology-14;process"/>
</owl:Class>

<owl:Class rdf:about="&untitled-ontology-14;process_2">
    <rdfs:subClassOf rdf:resource="&untitled-ontology-14;process"/>
</owl:Class>

<owl:Class rdf:about="&untitled-ontology-14;process_3">
    <rdfs:subClassOf rdf:resource="&untitled-ontology-14;process"/>
</owl:Class>

<owl:Class rdf:about="&untitled-ontology-14;products"/>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;input_1_of_process_1">
    <rdf:type rdf:resource="&untitled-ontology-14;process_1"/>
    <quantity rdf:datatype="&xsd;integer">5</quantity>
    <input rdf:resource="&untitled-ontology-14;product_2"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;input_1_of_process_2">
    <rdf:type rdf:resource="&untitled-ontology-14;process_2"/>
    <quantity rdf:datatype="&xsd;integer">3</quantity>
    <input rdf:resource="&untitled-ontology-14;product_4"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;input_1_of_process_3">
    <rdf:type rdf:resource="&untitled-ontology-14;process_3"/>
    <quantity rdf:datatype="&xsd;integer">2</quantity>
    <input rdf:resource="&untitled-ontology-14;product_2"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;input_2_of_process_1">
    <rdf:type rdf:resource="&untitled-ontology-14;process_1"/>
    <quantity rdf:datatype="&xsd;integer">2</quantity>
    <input rdf:resource="&untitled-ontology-14;product_3"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;input_2_of_process_2">
    <rdf:type rdf:resource="&untitled-ontology-14;process_2"/>
    <quantity rdf:datatype="&xsd;integer">10</quantity>
    <input rdf:resource="&untitled-ontology-14;product_5"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;input_2_of_process_3">
    <rdf:type rdf:resource="&untitled-ontology-14;process_3"/>
    <quantity rdf:datatype="&xsd;integer">3</quantity>
    <input rdf:resource="&untitled-ontology-14;product_4"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;output_1_of_process_1">
    <rdf:type rdf:resource="&untitled-ontology-14;process_1"/>
    <quantity rdf:datatype="&xsd;integer">1</quantity>
    <output rdf:resource="&untitled-ontology-14;product_1"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;output_1_of_process_2">
    <rdf:type rdf:resource="&untitled-ontology-14;process_2"/>
    <quantity rdf:datatype="&xsd;integer">1</quantity>
    <output rdf:resource="&untitled-ontology-14;product_2"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;output_1_of_process_3">
    <rdf:type rdf:resource="&untitled-ontology-14;process_3"/>
    <quantity rdf:datatype="&xsd;integer">1</quantity>
    <output rdf:resource="&untitled-ontology-14;product_3"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;product_1">
    <rdf:type rdf:resource="&untitled-ontology-14;products"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;product_2">
    <rdf:type rdf:resource="&untitled-ontology-14;products"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;product_3">
    <rdf:type rdf:resource="&untitled-ontology-14;products"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;product_4">
    <rdf:type rdf:resource="&untitled-ontology-14;products"/>
</owl:NamedIndividual>

<owl:NamedIndividual rdf:about="&untitled-ontology-14;product_5">
    <rdf:type rdf:resource="&untitled-ontology-14;products"/>
</owl:NamedIndividual>
</rdf:RDF>

1 ответ

Решение

Спасибо за большую очистку и переработку вашей онтологии. Однако я все еще не думаю, что это хороший способ запечатлеть то, что вы пытаетесь выразить. Например, ваша онтология включает в обозначение N3):

untitled-ontology-14:input_2_of_process_1
        a                              owl:NamedIndividual , untitled-ontology-14:process_1 ;
        untitled-ontology-14:input     untitled-ontology-14:product_3 ;
        untitled-ontology-14:quantity  2 .

untitled-ontology-14:input_1_of_process_1
        a                              owl:NamedIndividual , untitled-ontology-14:process_1 ;
        untitled-ontology-14:input     untitled-ontology-14:product_2 ;
        untitled-ontology-14:quantity  5 .

untitled-ontology-14:output_1_of_process_1
        a                              owl:NamedIndividual , untitled-ontology-14:process_1 ;
        untitled-ontology-14:output    untitled-ontology-14:product_1 ;
        untitled-ontology-14:quantity  1 .

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

Скорее, я думаю, что есть какой-то особый процесс, и он имеет два входа и один выход. Каждый вход и выход представляет собой пару количества и конкретного продукта.

Я бы представлял ваши процессы с чем-то вроде этого в N3 или RDF/XML. (Сейчас я собираюсь работать в чистом RDF; перевод на OWL - это просто объявление некоторых классов и свойств; в конце концов, это вопрос о SPARQL, а SPARQL - это язык запросов RDF.)

@prefix : <urn:ex:> .

:process1 a :Process ;
          :hasInput  [ a :Measure ; :quantity 2 ; :product :product3 ] ,
                     [ a :Measure ; :quantity 5 ; :product :product2 ] ;
          :hasOutput [ a :Measure ; :quantity 1 ; :product :product1 ] .

:process2 a :Process ;
          :hasInput  [ a :Measure ; :quantity  3 ; :product :product4 ] ,
                     [ a :Measure ; :quantity 10 ; :product :product5 ] ;
          :hasOutput [ a :Measure ; :quantity  1 ; :product :product2 ] .

:process3 a :Process ;
          :hasInput  [ a :Measure ; :quantity 2 ; :product :product2 ] ,
                     [ a :Measure ; :quantity 3 ; :product :product4 ] ;
          :hasOutput [ a :Measure ; :quantity 1 ; :product :product3 ] .
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="urn:ex:">
  <Process rdf:about="urn:ex:process3">
    <hasInput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >2</quantity>
        <product rdf:resource="urn:ex:product2"/>
      </Measure>
    </hasInput>
    <hasInput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >3</quantity>
        <product rdf:resource="urn:ex:product4"/>
      </Measure>
    </hasInput>
    <hasOutput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >1</quantity>
        <product rdf:resource="urn:ex:product3"/>
      </Measure>
    </hasOutput>
  </Process>
  <Process rdf:about="urn:ex:process2">
    <hasInput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >3</quantity>
        <product rdf:resource="urn:ex:product4"/>
      </Measure>
    </hasInput>
    <hasInput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >10</quantity>
        <product rdf:resource="urn:ex:product5"/>
      </Measure>
    </hasInput>
    <hasOutput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >1</quantity>
        <product rdf:resource="urn:ex:product2"/>
      </Measure>
    </hasOutput>
  </Process>
  <Process rdf:about="urn:ex:process1">
    <hasInput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >2</quantity>
        <product rdf:resource="urn:ex:product3"/>
      </Measure>
    </hasInput>
    <hasInput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >5</quantity>
        <product rdf:resource="urn:ex:product2"/>
      </Measure>
    </hasInput>
    <hasOutput>
      <Measure>
        <quantity rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >1</quantity>
        <product rdf:resource="urn:ex:product1"/>
      </Measure>
    </hasOutput>
  </Process>
</rdf:RDF>

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

prefix : <urn:ex:>

select * where {
 ?process :hasOutput [ :quantity ?q ; :product :product1 ] ;
          :hasInput [ :quantity ?inputq ; :product ?input ] .
 ?input ^:product/^:hasOutput ?subprocess          
}
---------------------------------------------------
| process   | q | inputq | input     | subprocess |
===================================================
| :process1 | 1 | 5      | :product2 | :process2  |
| :process1 | 1 | 2      | :product3 | :process3  |
---------------------------------------------------
Другие вопросы по тегам