我正在尝试编写一个简单的数据模拟规则来操作RDF本体中的布尔值。我现在正试着用RDFox作为推理者。
RDF本体是这样的
:citizenVaccinated rdfs:label "vaccinated";
a :citizen;
:isCitizenOf : uk
:automatedDecisionMaking rdfs:label "automatedDecisionMaking";
:hasValue xsd:True.
:basicInformationCheck rdfs:label "basicInformationCheck";
rdf:type xsd:False.
#:hasValue xsd:False.我写了一个小的数据记录规则
[:basicInformationCheck, rdf:type, xsd:True]:- [:citizenVaccinated, :isCitizenOf, :UK].当我查询basicInformationCheck值的最终图时,我会得到事实
rdf:type xsd:False
rdf:type xsd:True我们如何更改它以适应更新的事实?
发布于 2022-03-15 13:16:18
RDFox使您能够指定运行查询所针对的“事实域”。对于所有事实,这可以是IDB (默认),对于显式事实,可以是EDB,对于隐式事实,可以是IDBrepNoEDB (这是您想要使用的)。从5.5版开始,这些事实域已被重命名为all、explicit和derived。
要在shell中设置它们,只需执行以下操作:
set query.fact-domain IDBrepNoEDB
select ....您还可以在每个查询的基础上使用REST,方法是在回答查询时指定fact-domain URL参数,例如:
curl -i -X POST "<user>:<pw>@<server>:<port>/datastores/<datastore_name>/sparql?fact-domain=IDBrepNoEDB" -d "query=SELECT..."发布于 2022-03-25 09:59:55
似乎你希望“改变”一个价值。类似的东西是可能的,但重要的是要理解,Datalog不能更改已声明的属性值,即作为显式事实添加的属性值,只添加从将Datalog规则应用到显式事实中派生的新事实。这解释了在查询结果中同时获得两个值的原因:xsd:False是因为您显式地添加了它,而xsd:True是因为您添加了一个派生该值的规则。
正如@valerio的答案所描述的,通过推理添加的事实被建模为属于derived域,而通过加载RDF图添加的基本事实属于explicit域。虽然可以将查询限制在其中一个域,但我认为您想要的是继续对包含两种类型事实的域(默认行为)进行查询,并确保要更改的属性始终由Datalog规则设置,并且从不显式断言。这样,当满足相关条件时,您可以实现从false到true的更改。要做到这一点,需要RDFox的Datalog的一个叫做“失败的否定”的特性。
使用否定失败对缺省值进行建模
下面的示例是基于表示默认值和异常文档规则在实践中的共同用途部分中的RDFox示例的。我强烈建议阅读整个章节,以了解规则的作用。
我们将从海龟格式中的以下明确事实开始,这一事实只说明Tweety (他拥有URI :tweety)是英国公民:
:tweety a :UKCitizen .我们希望确保对于数据存储中的每个这样的公民,我们有一个布尔属性,指示他们是否通过了基本信息检查。这种财产应该是假的,除非我们有一个明确的事实表明,该公民接种了疫苗。以下对规则实现了这一点:
[?citizen, :basicInformationCheck, xsd:False] :-
[?citizen, a, :UKCitizen],
NOT [?citizen, :isVaccinated, xsd:True] .
[?citizen, :basicInformationCheck, xsd:True] :-
[?citizen, a, :UKCitizen],
[?citizen, :isVaccinated, xsd:True] .如果我们将上述事实和规则加载到RDFox数据存储中,然后运行SPARQL查询:
SELECT ?citizen ?passesCheck
WHERE {
?citizen a :UKCitizen ;
:basicInformationCheck ?passesCheck .
}我们会看到以下答案:
:tweety xsd:False .如果然后将以下三重添加到数据存储中:
:tweety :isVaccinated xsd:True然后重新运行查询,我们将看到:
:tweety xsd:True .其他问题
你的问题中还有几个明显的误解,我希望它能有助于指出这些误解。
首先,您使用谓词rdf:type,其值为xsd:True和xsd:False。这意味着xsd:True是一个类,但情况并非如此。xsd:False也是如此。在上面给出的示例中,我避免了这一点,只在谓词位置使用:basicInformationCheck。
其次,Datalog规则没有任何变量。这是完全正确的,但极不寻常。它只是增加了一个确切的三元组当且仅当另一个精确的三元组存在。通过确保基三元组同时包含这两个精确的三元组或两者都不包含,可以实现完全相同的效果。实际有用的Datalog规则几乎总是包含变量,如示例所示。
最后(次要)要注意的是,谓词a是rdf:type的同义词。你的数据使用了两者的混合。最好是始终如一地使用其中一种。
https://stackoverflow.com/questions/69531082
复制相似问题