SPARQL фильтр / агрегировать результаты по подграфу - PullRequest
0 голосов
/ 04 июня 2018

Я хотел бы написать запрос, который отфильтровывает некоторые результаты, используя некоторые другие свойства графика.Я объясняю этим примером.

Я моделирую систему разрешений.Есть некоторые предметы, ресурсы и разрешения.Субъекты имеют определенные разрешения на ресурсы.Некоторые разрешения подразумевают другие разрешения.Упрощенный пример с 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 .

Обратите также внимание, что я думал о добавлении целочисленного значения к каждому разрешению, чтобы я мог просто получить минимальное значение этого поля, но моя структура разрешений не одинарная.коренится в реальности, поэтому иногда это не подходит.

По сути, вопрос заключается в том, как удалить любые разрешения (для ресурса), которые подразумеваются другими результатами (для этого ресурса)

...