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