Как запустить операторы IN и NOT IN SPARQL в python rdflib, чтобы удалить пересечение двух графов - PullRequest
6 голосов
/ 25 апреля 2011

Я пытаюсь использовать операторы IN и NOT IN (которые были, если я правильно понимаю, введены в SPARQL 1.1) в реализации SPARQL на python (теперь в rdfextras ), но это кажется, что синтаксис не распознан.

Давайте рассмотрим два набора (A и B). Я хочу вывести то, что находится в наборе A, удалив то, что находится в наборе B.

SELECT ?title WHERE {
   some logic defining ?item and ?SetB
   FILTER (?item NOT IN ?SetB)
}

Может быть, эта конкретная вещь была добавлена ​​в SPARQL 1.1 и не поддерживается rdfextra, и в этом случае я хотел бы иметь обходной путь (или как это сделать без использования ключевого слова NOT IN)

Ответы [ 2 ]

5 голосов
/ 25 апреля 2011

Я пробовал аналогичный запрос, но также получил исключение при разборе.Я просмотрел код парсера SPARQL rdflib, и, похоже, не существует правила для обработки IN или NOT IN.Я бы предположил, что эта функция не реализована.

В любом случае, я не уверен, что вы используете его правильно.Взглянув на определение NOT IN в спецификации SPARQL 1.1 ..., он определяет оператор IN для использования со списком выражений.Поэтому вы должны сделать:

FILTER (?item NOT IN (?SetB))

И я не совсем уверен, что вы можете использовать переменные в правой части, потому что все примеры в спецификации используютterm. edit : см. сообщение RobV, возможно использование переменных в обходе RLH

с одним запросом

Одно из возможных решенийДля вас может подойти OPTIONAL и bound (оба поддерживаются в rdflib).Что-то вроде ...

SELECT ?title WHERE {
   some logic defining ?item
   OPTIONAL {
   some logic defining ?SetB
   }
   FILTER (bound(?SetB) && ?setB != ?item)
}

Не зная больше о вашем запросе, я не могу лучше посоветовать с этим делом.

Обходной путь с двумя запросами

Самый простой способ решить эту проблему с помощью rdlib - использовать фильтры и два запроса. Первый запрос извлекает все возможные значения для ?SetB.Ant во втором запросе вы динамически создаете фильтр:

SELECT ?title WHERE {
   some logic defining ?item
   FILTER (?item != <setb_val1> && ?item != <setb_val2> &&
   ... && ?item != <setb_val2>)
}
3 голосов
/ 25 апреля 2011

Трудно ответить без подробностей, но звучит так, как вы хотите MINUS:

SELECT ?title WHERE {
    ?item ... ITEM CRITERIA ...
    MINUS { ?item ... SET CRITERIA ... }
}

, например:

SELECT ?title WHERE {
    ?item ex:colour "red" .       # item is red
    MINUS { ?item ex:size "big" } # but not in set of big things
}

NOT IN немного вводит в заблуждение: насколькокак я могу сказать, он работает над выражением списка, а не над списком, который вы можете определить.

...