dotNetRDF推理机是否打算以这种方式使用?

问题描述 投票:0回答:1

我正在研究是否有可能定义游戏的基本本体,然后在此基础上定义任意魔术项目,而无需更新使用该本体的代码或sparql查询。

例如,我具有以下测试本体:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix : <http://rpg#>.

:underdarkElf rdfs:subClassOf :darkElf.
:darkElf rdfs:subClassOf :elf.

:scimitar :damageModifier 3.

:Unhan a :underdarkElf;
    :name "Unhan";
    :isWielding :scimitar;
    :isWearing :jetAmulet.

[Unhan戴着喷射护身符,如果持挥手是一个小精灵,那么它所使用的任何武器的伤害修正值都会加上+ 1,Unhan就是。这是通过以下方式定义的:

{
    ?entity a ?race;
        :isWielding ?weapon;
        :isWearing :jetAmulet.
    ?race rdfs:subClassOf :elf.
}
    => {?weapon :damageModifier 1.}.

这个想法是,安汗的弯刀的伤害修正值在他戴上护身符时从3增加到4。

为了使推理者从暗暗精灵到暗精灵再到精灵爬上rdfs:subClassOf的链,我不得不按所示顺序使用两个推理者:

var data = new Graph();
data.LoadFromFile(ontologyFilePath);

var rdfReasoner = new RdfsReasoner();
rdfReasoner.Initialise(data);
rdfReasoner.Apply(data);

var simpleReasoner = new SimpleN3RulesReasoner();
simpleReasoner.Initialise(data);
simpleReasoner.Apply(data);

var queryStr = @"
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX : <http://rpg#>

    SELECT ?name (SUM(?dm) as ?damageModifier)
    WHERE
    {
        ?entity :name ?name.
        ?entity :isWielding [:damageModifier ?dm].
    }
    GROUP BY ?name
";

var resultSet = data.ExecuteQuery(queryStr) as SparqlResultSet;

foreach (var u in resultSet)
{
    Console.WriteLine(u.ToString());
}

输出我想要的内容:

?name = Unhan , ?damageModifier = 4^^http://www.w3.org/2001/XMLSchema#integer

看来我必须按照所示的特定顺序使用两个推理机。

我做对了吗?

c# .net rdf dotnetrdf n3
1个回答
1
投票

总之,是的。

推理程序通过将推断出的三元组具体化为图形来工作;由于您的N3规则依赖于单个rdfs:subClassOf属性,因此需要首先应用RDFS推理程序,以便将rdfs:subClassOf层次结构展平。

您可以稍微简化N3规则,因为RDFS推理程序应从数据中推断:Unhan a :elf.。因此,您的N3规则可能是:

{
    ?entity a :elf;
        :isWielding ?weapon;
        :isWearing :jetAmulet.
}
    => {?weapon :damageModifier 1.}.
© www.soinside.com 2019 - 2024. All rights reserved.