Может ли RDF моделировать помеченный граф свойств со свойствами ребер? - PullRequest
6 голосов
/ 28 апреля 2019

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

enter image description here

Я хотел использовать язык RDF для выражения приведенного выше графика, особенно я хотел понять, могу ли я выразить метку края "loves" (который является URI для статьи / письма).

Я новичок в RDF и знаю, что RDF может легко выразить свойства узла в LPG, но можно ли удобно выразить свойства ребра?

Немного больше контекста этого вопроса: причина, по которой я хотел использовать RDF (а не Gremlin), заключается в том, что я хотел добавить возможность рассуждения в долгосрочной перспективе.

Далее добавлен вопрос : если мы выберем модель RDF для представления вышеуказанного LPG на простом английском языке, я хотел бы ответить на следующие вопросы с помощью запроса SPARQL:

  1. Любит ли Боб кого-нибудь?
  2. Если да, то в кого он влюблен и почему?

Насколько сложным будет оператор SPARQL для запроса loveletters.com/123?

1 Ответ

12 голосов
/ 28 апреля 2019

RDF не поддерживает свойства ребер, поэтому краткий ответ - не . Но, конечно, есть способы моделировать подобные вещи в RDF.

Обычный тройной RDF без свойств ребра

Если бы мы не хотели аннотировать границу, отношения между Бобом и Мэри были бы просто тройными с Бобом в качестве Субъекта, Мэри в качестве объекта и «любит» в качестве предиката:

PREFIX : <http://example.org/ontology#>
PREFIX person: <http://example.org/data/person/>

person:Bob :loves person:Mary.

Так, как мы можем добавить аннотации?

Вариант 1: использование RDF Reification

RDF имеет встроенное решение, называемое RDF reification. Позволяет делать заявления о высказываниях:

PREFIX : <http://example.org/ontology#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX person: <http://example.org/data/person/>
PREFIX statement: <http://example.org/data/statement/>

person:Bob :loves person:Mary.

statement:1 a rdf:Statement;
    rdf:subject person:Bob;
    rdf:predicate :loves;
    rdf:object person:Mary;
    :reason <http://loveletters.com/123>.

Итак, мы говорим, что есть утверждение с Бобом в качестве субъекта, Мэри в качестве объекта и «любит» в качестве предиката. Затем мы можем добавить свойства к этому утверждению. Недостатком является то, что это отчасти избыточно. Сначала мы добавляем тройку «любит», затем добавляем еще четыре тройки, чтобы воспроизвести тройку «любит».

Вариант 2: Моделирование отношений как сущностей

Другой подход заключается в изменении модели. Вместо того, чтобы рассматривать «любит» грань между людьми, мы считаем, что это сам по себе узел. Узел, представляющий отношения и связанный с двумя участвующими сторонами.

PREFIX relationship: <http://example.org/data/relationship/>

relationship:1 a :LovesRelationship;
    :who person:Bob;
    :whom person:Mary;
    :reason <http://loveletters.com/123>.

Итак, в нашей модели мы создали класс :LovesRelationship, который представляет слова «любит», и свойства :who и :whom для обозначения двух сторон. Недостатком этого подхода является то, что структура графа больше не представляет нашу социальную сеть. Поэтому, когда мы спрашиваем, как связаны два человека, мы всегда должны проходить через эти сущности отношений, а не просто иметь дело с гранями, соединяющими людей.

Вариант 3: Использование RDF *

Существует предложение под названием RDF *, которое решает эту проблему довольно хорошо. (Иногда это называется RDR или Reification Done Right .) RDF * / RDR добавляет новый синтаксис, который позволяет тройкам быть объектом других троек:

<<person:Bob :loves person:Mary>>
    :reason <http://loveletters.com/123>.

Недостатком является то, что он нестандартный и пока поддерживается только несколькими системами ( Blazegraph , AnzoGraph и расширение для Jena ) , По состоянию на апрель 2019 года Нептун не входит в их число.

Запрос: Боб любит кого-нибудь?

Это легко сделать в базовой версии RDF, а также в Варианте 1 и Варианте 3:

ASK { person:Bob :loves ?anyone }

Вариант 2 требует другого запроса из-за измененной модели:

ASK {
   ?rel a :LovesRelationship;
       :who person:Bob.
}

Это будет соответствовать любому :LovesRelationship, где свойство :who равно Бобу, независимо от свойств :whom и :reason.

Вопрос: в кого влюблен Боб и почему?

Вариант 1 , RDF Reification:

SELECT ?whom ?why {
    ?statement a rdf:Statement;
        rdf:subject person:Bob;
        rdf:predicate :loves;
        rdf:object ?whom;
        :reason ?why.
}

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

Опция 2 , отношения смоделированы как сущность:

SELECT ?whom ?why {
    ?rel a :LovesRelationship;
        :who person:Bob;
        :whom ?whom;
        :reason ?why.
}

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

Опция 3 , RDF *, с использованием SPARQL *:

SELECT ?whom ?why {
    <<person:Bob :loves ?whom>>
        :reason ?why.
}

Это лаконично и интуитивно понятно, поэтому жаль, что в настоящее время мы не можем использовать его в большинстве систем SPARQL!

...