Search code examples
sparqlrdf

How to store conditional data in RDF


I want to store some facts in pure RDF data (ttl) like :

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

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

:Susan  a :Person ;
       :hasGender :Female .

and then read this rdf data (ttl) by Sparql or other app (rdf4j or rdflib) , and get :

:Susan :drink :softDrinks .

I want to use pure RDF as much as possible to store data, rather than OWL, N3, RDF-star or SHACL, but I can reconstruct a new N3 or shacl file from these rdf data, and then get infered result. I wonder if this is possible in RDF, an how can I modify this RDF data? Thanks.


Solution

  • I got It done. here is data.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 .
    

    here is the sparql query:

        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 )
        }
    

    and I get the result:

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