小能豆

如何在 python 中的 sparql 查询中添加列表作为参数

py

我使用SPARQLWrapper如下方法运行我的 Wikidata 查询。

from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd

sparql = SPARQLWrapper("https://query.wikidata.org/sparql")

sparql.setQuery("""
    SELECT DISTINCT ?item {
    VALUES ?searchTerm { "word2vec" "fasttext" "natural language processing" "deep learning" "support vector machine" }
    SERVICE wikibase:mwapi {
        bd:serviceParam wikibase:api "EntitySearch".
        bd:serviceParam wikibase:endpoint "www.wikidata.org".
        bd:serviceParam wikibase:limit 3 .
        bd:serviceParam mwapi:search ?searchTerm.
        bd:serviceParam mwapi:language "en".
        ?item wikibase:apiOutputItem mwapi:item.
        ?num wikibase:apiOrdinal true.
    }
    ?item (wdt:P279|wdt:P31) ?type
    }
    ORDER BY ?searchTerm ?num                    
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
results_df = pd.io.json.json_normalize(results['results']['bindings'])
print(results_df)

我想将单词列表"word2vec" "fasttext" "natural language processing" "deep learning" "support vector machine"以 python 列表的形式给出。即如下所示。

mylist = ["word2vec", "fasttext", "natural language processing", "deep learning", "support vector machine"]

在这种情况下,我如何将其mylist作为参数插入到我上面提到的现有 wikidata 查询中。

我尝试按如下方式使用 f 字符串。但是,它对我来说不起作用。

sparql.setQuery(f"
        SELECT DISTINCT ?item {
        VALUES ?searchTerm { {mylist} }
        SERVICE wikibase:mwapi {
            bd:serviceParam wikibase:api "EntitySearch".
            bd:serviceParam wikibase:endpoint "www.wikidata.org".
            bd:serviceParam wikibase:limit 3 .
            bd:serviceParam mwapi:search ?searchTerm.
            bd:serviceParam mwapi:language "en".
            ?item wikibase:apiOutputItem mwapi:item.
            ?num wikibase:apiOrdinal true.
        }
        ?item (wdt:P279|wdt:P31) ?type
        }
        ORDER BY ?searchTerm ?num                    
    ")

如果需要,我很乐意提供更多详细信息。


阅读 33

收藏
2024-12-25

共1个答案

小能豆

在你提供的 PHP 和 Python 代码中,PHP 使用了 gzcompress() 函数来压缩字符串,而 Python 试图用 zlib.decompress() 解压这个字符串。不过,问题出在 PHP 的 gzcompress() 返回的是一个字符串,而 zlib.decompress() 需要的是字节对象。为了解决这个问题,你只需确保在 Python 中传递的压缩数据是字节形式,而不是字符串。

解决方案:

  1. 确保传递给 Python 的数据是字节对象
    在 PHP 中,gzcompress() 返回的是一个字节串,通常会被处理为字符串,但它实际上包含了字节数据。因此,在将其发送到 Python 服务器之前,你需要将 PHP 中的压缩数据以字节形式正确地发送。

  2. PHP 中的修改
    在 PHP 中,确保 gzcompress() 的返回值作为字节流发送到 Python 服务器(如果它是通过 HTTP 请求传递的,使用合适的编码,如 Base64 编码进行传输)。

修改 PHP 代码如下:

php $text = gzcompress($text); // 如果通过 HTTP 传输,使用 Base64 编码确保安全传输 $encoded_text = base64_encode($text); // send $encoded_text to the Python server

  1. Python 中的解压缩
    在 Python 端,接收到压缩数据后,你需要先对 Base64 编码的字符串进行解码,得到字节数据,然后再用 zlib.decompress() 进行解压缩。

修改 Python 代码如下:

```python
import zlib
import base64

# 获取传递过来的 Base64 编码的压缩数据
text = request.POST.get(‘text’, ‘’)

# 解码 Base64 字符串,得到压缩的字节数据
compressed_text = base64.b64decode(text)

# 解压缩字节数据
new_text = zlib.decompress(compressed_text)

# 现在 new_text 就是解压后的原始数据
```

解释:

  • 在 PHP 端使用 base64_encode() 对压缩的字节数据进行编码。这是因为 HTTP 协议通常不能直接传输字节数据,因此需要对其进行编码。Base64 编码将二进制数据转换为字符数据,适合通过 HTTP 请求发送。
  • 在 Python 端,接收到 Base64 编码的数据后,使用 base64.b64decode() 解码得到原始的字节数据,然后再使用 zlib.decompress() 对其进行解压缩。

总结:

通过对压缩数据进行 Base64 编码和解码,可以确保数据在网络上传输时不受字符集和协议限制的影响。在 PHP 中进行编码,在 Python 中解码,然后解压缩,应该就能正常处理跨语言的压缩解压操作。

2024-12-25