SPARQL параметризованные запросы - PullRequest
4 голосов
/ 08 декабря 2011

Добрый день! Я применяю rdflib для Python. У меня вопрос. Как поместить переменную в запрос SPARQL? Вместо «OSPF» в курсе: OSPF!

qres = g.query(
    """SELECT ?x ?z ?y
        WHERE {
           course:OSPF course:termName ?x.
           course:OSPF ?s ?t.
           ?s ?d ?z.
           ?t course:termName ?y.
           FILTER (regex(?z,"[^a-z]","i") && isLiteral(?z) )
        }"""
        ,initNs=dict(course=Namespace.....

@ msalvadores Я хочу ввести мою переменную с консоли. ---> python parse.py OSPF Значение переменной (OSPF) может быть другим. Как я могу инициализировать его в запрос (ГДЕ)? Я решил свой вопрос путем интерполяции переменной несколько дней назад. Как это:

    qtest = "OSPF","OSPF"
    q =( """SELECT ?x ?z ?y\
            WHERE {\
               course:%s course:termName ?x.\
               course:%s ?s ?t.\
               ?s ?d ?z.\
               ?t course:termName ?y.\
               FILTER (regex(?z,'[^a-z0-9]','i') && isLiteral(?z) )\
            }ORDER BY ASC(?s)\
            """)% qtest
   qres = g.query(q, initNs=dict(course=Namespace

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

1 Ответ

3 голосов
/ 08 декабря 2011

Если вы имеете в виду переменную Python в запросе, вы можете просто ...

qres = g.query(
    """SELECT ?x ?z ?y
        WHERE {
           """+some_uri+""" course:termName ?x.
           """+some_uri+""" ?s ?t.
           ?s ?d ?z.
           ?t course:termName ?y.
           FILTER (regex(?z,"[^a-z]","i") && isLiteral(?z) )
        }"""
        ,initNs=dict(course=Namespace.....

Если вы хотите преобразовать курс: OSPF в переменную в SPARQL, то ...

qres = g.query(
    """SELECT ?newVar ?x ?z ?y
        WHERE {
           ?newVar course:termName ?x.
           ?newVar ?s ?t.
           ?s ?d ?z.
           ?t course:termName ?y.
           FILTER (regex(?z,"[^a-z]","i") && isLiteral(?z) )
        }"""
        ,initNs=dict(course=Namespace.....

Если вы чуть подробнее объясните, что делает ваш запрос и как выглядят ваши данные, мы могли бы помочь вам лучше.

Отредактировано

Только изменитьВам может потребоваться сформулировать запрос SPARQL, не повторяя переменную, что-то вроде ...

q = """SELECT ?x ?z ?y
        WHERE {
           course:%s course:termName ?x;
                  ?s ?t.
           ?s ?d ?z.
           ?t course:termName ?y.
           FILTER (regex(?z,'[^a-z0-9]','i') && isLiteral(?z) )
        }ORDER BY ASC(?s)
        """%var_value

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

...