Как хранить условные данные в RDF

#sparql #rdf

Вопрос:

Я хочу сохранить некоторые факты в чистых данных RDF (ttl), например :

 :Person :hasGender :Male, :Female ;
             :drink :Liquor, :softDrinks .

if (:someone :hasGender :Male) then
     :someone :drink :Liquor ;
else
     :someone :drink :softDrinks .

:Susan  a :Person ;
       :hasGender :Female .
 

а затем прочитайте эти данные rdf (ttl) с помощью Sparql или другого приложения (rdf4j или rdflib) и получите :

 :Susan :drink :softDrinks .
 

Я хочу использовать чистый RDF как можно больше для хранения данных, а не OWL, N3, RDF-star или SHACL, но я могу восстановить новый файл N3 или shacl из этих данных rdf, а затем получить выводимый результат.
Интересно, возможно ли это в RDF, и как я могу изменить эти данные RDF? Спасибо.

Комментарии:

1. простой RDF-это просто простые явные утверждения. И даже если вы используете RDFS, такой вывод невозможен . Именно поэтому люди придумали OWL и SWRL поверх RDF — чтобы сделать его более выразительным. Либо вы используете что-то поверх RDF, либо это просто невозможно. Это оно.

2. Спасибо вам за ваше объяснение. Я думаю, то, что ты сказал, имеет смысл. Я просто пытаюсь хранить простые условные данные для конкретных сценариев применения. Я думаю, что до сих пор этот подход в основном отвечает моим требованиям

Ответ №1:

Я сделал Это. вот данные.ttl :

  @prefix : <http://example.org/#> .
:Person :drink :someLiquid .
:someLiquid :hasRule :rule1, :rule2.
:rule1 :forGender :Male ;
       :beverage :liquor .
:rule2 :forGender :Female ;
       :beverage :softDrinks .       
    
:Susan  a :Person ;
       :hasGender :Female .
:John a :Person ;
       :hasGender :Male .
 

вот запрос sparql:

     PREFIX : <http://example.org/#>
     SELECT ?person ?gender ?beverage
     WHERE {
        :Person :drink :someLiquid .
        :someLiquid :hasRule ?rule .
        ?rule :forGender ?forGender ;
              :beverage ?beverage .
        ?person a :Person;        
             :hasGender ?gender .
      FILTER ( ?gender = ?forGender )
    }
 

и я получаю результат:

 1    person,   gender,   beverage
2    :Susan,  :Female,  :softDrinks
3    :John,   :Male,    :liquor