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!