SPARQL параметризованные запросы

Добрый день! Я применяю 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 ответ

Решение

Если вы имеете в виду переменную 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 шаблон, мне нужно увидеть некоторые образцы данных. Я подозреваю, что вы пытаетесь добиться слишком многого с помощью этого запроса. Если ваш набор данных большой, этот запрос будет очень медленным. Я не могу сказать больше, чем это, не видя данных.

Другие вопросы по тегам