Разумники dotNetRDF предназначены для использования таким образом? - PullRequest
0 голосов
/ 08 марта 2020

Я исследую, возможно ли определить базовую онтологию игры, а затем определить произвольные магические элементы c, не требуя обновления кода или запросов 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.

У Унхана есть амулет с реактивным двигателем, который добавляет +1 к модификатору урона любого вооруженного оружия, при условии, что владелец - эльф, которым является Унхан. Это определяется следующим образом:

{
    ?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.

Я правильно делаю?

1 Ответ

1 голос
/ 08 марта 2020

Короче говоря, да.

Рассуждающие работают, материализуя выведенные тройки в граф; поскольку ваше правило N3 основано на одном свойстве rdfs: subClassOf, вам необходимо сначала применить аргумент RDFS, чтобы иерархия rdfs: subClassOf была выровнена.

Вы можете немного упростить правило N3, как и RDFS рассудок должен вывести :Unhan a :elf. из данных. Таким образом, ваше правило N3 может быть:

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