如何在SPARQL本体查询中使用python变量?

2024-05-08 21:36:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题可能很简单:如何在SPARQL查询中使用python变量?我正在尝试进行查询以识别用户键入的内容。在

例如,如果用户键入“house”,软件将使用该条目运行查询。现在,我用以下代码运行了一个测试(我使用的是Tkinter):

self.queryonto = Entry(self.frame1)
self.queryonto.pack(side=LEFT)

self.btnquery = Button(self.frame1, text='Query ontology')
     self.btnquery['command'] = self.makequery
     self.btnquery.pack(side=LEFT)

def makequery(self):
    self.ontology = World()
    self.onto = self.ontology.get_ontology('file://file.owl').load()
    self.baseiri = self.onto.base_iri
    self.graph = self.ontology.as_rdflib_graph()

    self.request = """PREFIX ont: <{}> 
                               SELECT ?class  
                               WHERE {  
                               ont:{} a ?class . 
                               }""".format(self.baseiri, self.queryonto)
    self.results = list(self.graph.query(self.request))
    print(self.results)

我几乎可以肯定我使用.format是错误的。所以,我问:如何使用我在这个查询中创建的变量?如果我可以用字符串操作来实现,那么在这种情况下,正确的方法是什么呢?在


Tags: 用户self键入leftsidepackfilegraph
1条回答
网友
1楼 · 发布于 2024-05-08 21:36:41

我使用以下Python函数:

def createConcat(self, data, separator = ";;;"):
    """ Creates concat string. """
    return "(group_concat(distinct ?"+data+";separator='"+separator+"') as ?"+data+"_s)" 

def createSparqlQuery(self, data, separator = ";;;", key = "root", offset = 100):
    """Generates SPARQL query from input file."""
    query = []
    orderby = []
    select = "SELECT DISTINCT"
    #from_each_subpage
    for prop in data['select']:
        if prop.endswith("_s"):
            select +=" "+ self.createConcat(prop.split("_")[0])
        else:
            v = "?"+ prop.replace('_X','')
            select += " "+ v
            orderby.append(v)
    where = " WHERE { "
    closing = 1
    query.append(select)
    query.append(where)
    try:
        service = "SERVICE "+data['service'] + " {"
        query.append(service)
        closing += 1
    except:
        pass
    query.append('\n'.join(data[key]))
    while closing > 0:
        query.append('}')
        closing -= 1
    o = " ORDER BY " + ' '.join(orderby)
    query.append(o)
    try:
        limit = data['limit']
        l = " LIMIT %s" % limit
        query.append(l)
    except:
        pass

    complete_query = '\n'.join(query)
    print complete_query
    return complete_query

所以实际上是一点字符串操作,使用" distinct?" + data + ";"l = " LIMIT %s" % limit替换,将每个字符串附加到一个列表,然后连接列表以创建查询:complete_query = '\n'.join(query)

更新:

要更清楚地回答操作请求:

^{pr2}$

还要确保self.queryonto有一个string表示。在

相关问题 更多 >