Поиск RDF-графика для частичных совпадений - PullRequest
3 голосов
/ 15 февраля 2011

Как мне выполнить поиск в базе данных RDF, чтобы найти сегменты графа, которые больше всего перекрывают образец графа?

Например, скажем, в моей базе данных хранятся следующие произвольные графы:

entity1 [
    type "TOP" ;
    attr1 [
        attr11 [
            attr111 "apple" ;
        ] ;
        attr12 [
            attr121 "orange" ;
        ] ;
        attr13 [
            attr131 "banana" ;
        ] ;
    ] ;
    attr2 [
        attr21 [
            attr211 "falcon" ;
        ] ;
        attr22 [
            attr221 "pigeon" ;
        ] ;
        attr23 [
            attr231 "parrot" ;
        ] ;
    ] ;
] .
entity2 [
    type "TOP" ;
    attr11 [
        attr111 "apple" ;
    ] ;
    attr12 [
        attr121 "orange" ;
    ] ;
] .
entity3 [
    type "TOP" ;
    attr2 [
        attr_middle [
            attr21 [
                attr211 "falcon" ;
            ] ;
            attr22 [
                attr221 "pigeon" ;
            ] ;
            attr23 [
                attr231 "parrot" ;
            ] ;
        ] ;
    ] ;
] .

А теперь скажите, что у меня есть пример графика:

sample [
    type "TOP" ;
    attr11 [
        attr111 "apple" ;
    ] ;
    attr12 [
        attr121 "orange" ;
    ] ;
    attr13 [
        attr131 "banana" ;
    ] ;
    attr21 [
        attr211 "falcon" ;
    ] ;
    attr22 [
        attr221 "pigeon" ;
    ] ;
    attr23 [
        attr231 "parrot" ;
    ] ;
] .

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

Как найти наиболее близкие совпадения с образцом?В этом случае я ожидаю, что запрос вернется, сначала отсортированное наилучшее совпадение, [entity1, entity3, entity2].

Я все еще немного новичок в RDF, так что извините, если моя терминология выключена.Поскольку я в настоящее время понимаю базы данных RDF, то, что я пытаюсь сделать, обычно не то, как они используются.Если я хочу найти сущности, «содержащие» отношение attr111 = «apple», с помощью запроса SPARQL, я, как правило, должен предположить, что отношение находится в фиксированном местоположении относительно каждого объекта, тогда как поиск выполняется в тройках в произвольных местах относительно«корень» гораздо сложнее.Это правильно?

1 Ответ

2 голосов
/ 17 февраля 2011

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

Примечание - Если в результирующем запросе нет переменных, его лучше сформулировать как запрос ASK. Если вы используете запрос SELECT и нет переменных, у вас нет возможности различить результаты запроса, которые совпадают, и результаты, которые не соответствуют. В то время как запрос ASK возвращает либо true, либо false, в зависимости от того, соответствует ли предложение WHERE

Если ваш процессор SPARQL поддерживает SPARQL 1.1, вы можете использовать пути к свойствам .e.g

SELECT * WHERE { ?s ex:predicate / ex:predicate / ex:predicate "value" }

Если у вас есть только SPARQL 1.0, вы должны явно указать соответствие следующим образом:

SELECT * WHERE
{
  ?s ex:predicate _:b1 .
  _:b1 ex:predicate _:b2 .
  _:b2 ex:predicate "value" .
}

Обратите внимание, что семантически эти две формы фактически эквивалентны - форма SPARQL 1.1 является хорошим синтаксическим сочетанием клавиш для формы SPARQL 1.0.

Очевидно, что чем больше часть вашего Графика будет расти, тем больше будет ваш запрос SPARQL.

...