Python SPARQL参数化查询

Python SPARQL参数化查询,python,sparql,parameterized-query,rdflib,Python,Sparql,Parameterized Query,Rdflib,你好!我将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.

你好!我将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.....
@msalvadors 我想通过控制台输入变量。-->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

但我想可以用另一种方法。因为在我看来,我提出的解决方案并不完全正确。

如果你是指查询中的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.....
如果您想将course: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.....
如果您进一步解释一下您的查询是做什么的,以及您的数据是什么样子的,那么我们可能会提供更好的帮助

已编辑

yo可能想做的唯一更改是在不重复变量的情况下制定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
模式,我需要查看一些示例数据。我怀疑您试图通过这个查询实现太多的目标。如果你的数据集很大,这个查询会非常慢。如果您认为这是正确答案,请选择“接受”。再见,谢谢!我已经用你的符号更正了我的代码。这对我真的很有帮助。这里的假设是
某些uri
不包含SPARQL控制字符(CWE-89)。使用常规字符串连接编写SPARQL查询可能很危险。