Sparql-запрос по списку ограничений (Эквивалентный) в протеже

Моя онтология о Коктейле. Это коктейль под названием "AfterGlow"

<owl:Class rdf:about="&cocktails;AfterGlow">
    <owl:equivalentClass>
        <owl:Class>
            <owl:intersectionOf rdf:parseType="Collection">
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&cocktails;aPourIngredient"/>
                    <owl:someValuesFrom rdf:resource="&cocktails;JusAnanas"/>
                </owl:Restriction>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&cocktails;aPourIngredient"/>
                    <owl:someValuesFrom rdf:resource="&cocktails;JusOrange"/>
                </owl:Restriction>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&cocktails;aPourIngredient"/>
                    <owl:someValuesFrom rdf:resource="&cocktails;SiropGrenadine"/>
                </owl:Restriction>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&cocktails;aPourDescription"/>
                    <owl:hasValue>Descriptoion AfterGlow</owl:hasValue>
                </owl:Restriction>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="&cocktails;aPourTitre"/>
                    <owl:hasValue>AfterGlow</owl:hasValue>
                </owl:Restriction>
            </owl:intersectionOf>
        </owl:Class>
    </owl:equivalentClass>
    <rdfs:subClassOf rdf:resource="&cocktails;Cocktail"/>
</owl:Class>

JusOrange означает апельсиновый сокJusAnanas означает ананасовый сок

aPourIngredient это property что означает "имеет (содержит) ингредиент"

Это запрос, в котором перечислены все мои коктейли с указанием их

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <http://www.semanticweb.org/cocktails#>
SELECT *
WHERE { 
  ?Cocktail rdfs:subClassOf :Cocktail.
  ?Cocktail owl:equivalentClass ?restriction .
}

Как я могу запросить, например, "выбрать весь коктейль, который содержит JusAnanas И JusOrange"

Вы можете найти мою онтологию здесь:

https://s3-eu-west-1.amazonaws.com/ontologycero/cocktailsOnthology.owl

Я уже нашел некрасивый запрос, но его нельзя использовать, потому что мы должны знать онтологию для использования этого типа запроса.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <http://www.semanticweb.org/cocktails#>
SELECT *
WHERE { 
  ?Cocktail rdfs:subClassOf :Cocktail.
  ?Cocktail owl:equivalentClass ?restriction .
  ?restriction owl:intersectionOf ?intersection.
  ?intersection rdf:first ?ingredient1.
  ?intersection rdf:rest ?rest1.
  ?rest1 rdf:first ?ingredient2.
  ?rest1 rdf:rest ?rest2.
  ?rest2 rdf:first ?ingredient3.

  ?ingredient1 owl:someValuesFrom :JusAnanas.
  ?ingredient2 owl:someValuesFrom :JusOrange.
}

2 ответа

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

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <http://www.semanticweb.org/cocktails#>
SELECT *
WHERE { 
  ?Cocktail rdfs:subClassOf :Cocktail.
  ?Cocktail owl:equivalentClass ?restriction .
  ?restriction (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?ingredient1.
  ?restriction (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?ingredient2.
  ?ingredient1 owl:someValuesFrom :JusAnanas.
  ?ingredient2 owl:someValuesFrom :JusOrange.
  }

SPARQL не предназначен для понимания официальной модели OWL, которую вы создали. Это язык запросов сопоставления с графическими шаблонами для тройки RDF. Поэтому вместо того, чтобы пытаться выполнить запрос по модели, запросите данные, используя семантику разработанной вами модели:

SELECT *
WHERE {
   ?coctails rdfs:subClassOf* :Cocktail .
   ?aoCocktail a ?coctails .
   ?aoCocktail :aPourIngredient :JusAnanas .
   ?aoCocktail :aPourIngredient :JusOrange .
}

Первые два тройных паттерна находят всех членов :Cocktail и его подклассы. Последние два тройных шаблона находят всех членов, которые имеют оба :JusOrange а также :JusAnanas в качестве значения для свойства :aPourIngredient,

Другие вопросы по тегам