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