SPARQL 参数化查询

5 投票
1 回答
1821 浏览
提问于 2025-04-17 07:55

大家好!我在用Python的rdflib库,有个问题想请教一下。怎么把变量放进SPARQL查询里呢?比如说,想把'OSPF'替换成course: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)的值可能是其他的。那我该怎么把它放进查询的WHERE部分呢?几天前我通过变量插值解决了这个问题。像这样:

    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

如果你在查询中提到一个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这个模式,我需要看看一些示例数据。我怀疑你这个查询想要实现的目标太多了。如果你的数据集很大,这个查询会非常慢。在没有看到数据之前,我无法说更多。

撰写回答