首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rdf图上的Datalog规则更改事实的(布尔)值

rdf图上的Datalog规则更改事实的(布尔)值
EN

Stack Overflow用户
提问于 2021-10-11 18:46:08
回答 2查看 127关注 0票数 2

我正在尝试编写一个简单的数据模拟规则来操作RDF本体中的布尔值。我现在正试着用RDFox作为推理者。

RDF本体是这样的

代码语言:javascript
复制
: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.

我写了一个小的数据记录规则

代码语言:javascript
复制
[:basicInformationCheck, rdf:type, xsd:True]:- [:citizenVaccinated, :isCitizenOf, :UK].

当我查询basicInformationCheck值的最终图时,我会得到事实

代码语言:javascript
复制
rdf:type xsd:False
rdf:type  xsd:True

我们如何更改它以适应更新的事实?

EN

回答 2

Stack Overflow用户

发布于 2022-03-15 13:16:18

RDFox使您能够指定运行查询所针对的“事实域”。对于所有事实,这可以是IDB (默认),对于显式事实,可以是EDB,对于隐式事实,可以是IDBrepNoEDB (这是您想要使用的)。从5.5版开始,这些事实域已被重命名为allexplicitderived

要在shell中设置它们,只需执行以下操作:

代码语言:javascript
复制
set query.fact-domain IDBrepNoEDB
select ....

您还可以在每个查询的基础上使用REST,方法是在回答查询时指定fact-domain URL参数,例如:

代码语言:javascript
复制
curl -i -X POST "<user>:<pw>@<server>:<port>/datastores/<datastore_name>/sparql?fact-domain=IDBrepNoEDB" -d "query=SELECT..."
票数 3
EN

Stack Overflow用户

发布于 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)是英国公民:

代码语言:javascript
复制
:tweety a :UKCitizen .

我们希望确保对于数据存储中的每个这样的公民,我们有一个布尔属性,指示他们是否通过了基本信息检查。这种财产应该是假的,除非我们有一个明确的事实表明,该公民接种了疫苗。以下对规则实现了这一点:

代码语言:javascript
复制
[?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查询:

代码语言:javascript
复制
SELECT ?citizen ?passesCheck
WHERE {
    ?citizen a :UKCitizen ;
             :basicInformationCheck ?passesCheck .
}

我们会看到以下答案:

代码语言:javascript
复制
:tweety xsd:False .

如果然后将以下三重添加到数据存储中:

代码语言:javascript
复制
:tweety :isVaccinated xsd:True

然后重新运行查询,我们将看到:

代码语言:javascript
复制
:tweety xsd:True .

其他问题

你的问题中还有几个明显的误解,我希望它能有助于指出这些误解。

首先,您使用谓词rdf:type,其值为xsd:Truexsd:False。这意味着xsd:True是一个类,但情况并非如此。xsd:False也是如此。在上面给出的示例中,我避免了这一点,只在谓词位置使用:basicInformationCheck

其次,Datalog规则没有任何变量。这是完全正确的,但极不寻常。它只是增加了一个确切的三元组当且仅当另一个精确的三元组存在。通过确保基三元组同时包含这两个精确的三元组或两者都不包含,可以实现完全相同的效果。实际有用的Datalog规则几乎总是包含变量,如示例所示。

最后(次要)要注意的是,谓词ardf:type的同义词。你的数据使用了两者的混合。最好是始终如一地使用其中一种。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69531082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档