Я хотел бы написать запрос, который отфильтровывает некоторые результаты, используя некоторые другие свойства графика.Я объясняю этим примером.
Я моделирую систему разрешений.Есть некоторые предметы, ресурсы и разрешения.Субъекты имеют определенные разрешения на ресурсы.Некоторые разрешения подразумевают другие разрешения.Упрощенный пример с 3 разрешениями и 3 ресурсами, на которые у одного субъекта есть одно (два в одном случае) из этих разрешений.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <http://schema#>
PREFIX d: <http://data#>
INSERT DATA {
:Permission rdf:type rdf:Property .
:Read rdf:type rdf:Property ;
rdfs:subPropertyOf :Permission .
:Write rdf:type rdf:Property ;
rdfs:subPropertyOf :Permission ;
:implies :Read .
:Admin rdf:type rdf:Property ;
rdfs:subPropertyOf :Permission ;
:implies :Write ,
:Read .
d:s1 rdf:type :Subject .
d:r1 rdf:type :Resource .
d:r2 rdf:type :Resource .
d:r3 rdf:type :Resource .
d:s1 :Admin d:r1 .
d:s1 :Read d:r1 .
d:s1 :Write d:r2 .
d:s1 :Read d:r3 .
}
Я могу легко написать запрос, чтобы увидеть для данного субъекта, чтоподразумеваемые разрешения для некоторых ресурсов.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <http://schema#>
PREFIX d: <http://data#>
SELECT DISTINCT ?subject ?resource ?implied (?permission AS ?implied_by)
WHERE {
BIND(d:s1 AS ?subject)
?resource rdf:type :Resource .
?subject rdf:type :Subject .
?permission rdfs:subPropertyOf :Permission ;
:implies* ?implied .
?subject ?permission ?resource .
}
Это даст некоторые результаты, такие как:
+----------------+----------------+---------------------+---------------------+
| subject | resource | implied | implied_by |
+----------------+----------------+---------------------+---------------------+
| http://data#s1 | http://data#r1 | http://schema#Admin | http://schema#Admin |
| http://data#s1 | http://data#r1 | http://schema#Read | http://schema#Admin |
| http://data#s1 | http://data#r1 | http://schema#Write | http://schema#Admin |
| http://data#s1 | http://data#r1 | http://schema#Read | http://schema#Read |
| http://data#s1 | http://data#r3 | http://schema#Read | http://schema#Read |
| http://data#s1 | http://data#r2 | http://schema#Write | http://schema#Write |
| http://data#s1 | http://data#r2 | http://schema#Read | http://schema#Write |
+----------------+----------------+---------------------+---------------------+
Я хотел бы написать запрос, который возвращает толькоминимальный список разрешений на ресурс, который подразумевает все остальные.Любые идеи о том, как я мог бы добиться этого эффективно, были бы очень кстати. Это похоже на агрегацию MAX
, но где график фактически необходим для определения результатов.Например, идеальные результаты были бы:
+----------------+----------------+---------------------+---------------------+
| subject | resource | implied | implied_by |
+----------------+----------------+---------------------+---------------------+
| http://data#s1 | http://data#r1 | http://schema#Admin | http://schema#Admin |
| http://data#s1 | http://data#r3 | http://schema#Read | http://schema#Read |
| http://data#s1 | http://data#r2 | http://schema#Write | http://schema#Write |
+----------------+----------------+---------------------+---------------------+
Обратите внимание, что данные и запросы на самом деле более сложны, чем это, поэтому мне абсолютно необходимо использовать путь к параметру, даже если я затем хочу избавитьсябольшей части информации, которую он вводит.
?permission rdfs:subPropertyOf :Permission ;
:implies* ?implied .
Обратите также внимание, что я думал о добавлении целочисленного значения к каждому разрешению, чтобы я мог просто получить минимальное значение этого поля, но моя структура разрешений не одинарная.коренится в реальности, поэтому иногда это не подходит.
По сути, вопрос заключается в том, как удалить любые разрешения (для ресурса), которые подразумеваются другими результатами (для этого ресурса)