首页 > 解决方案 > 如何在 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 .

然后通过 Sparql 或其他应用程序(rdf4j 或 rdflib)读取此 rdf 数据(ttl),并获取:

:Susan :drink :softDrinks .

我想尽可能使用纯RDF来存储数据,而不是OWL、N3、RDF-star或者SHACL,但是我可以从这些rdf数据中重构一个新的N3或者shacl文件,然后得到推断结果。我想知道这在 RDF 中是否可行,我该如何修改这个 RDF 数据?谢谢。

标签: sparqlrdf

解决方案


我搞定了。这是 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 .

这是 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

推荐阅读