如何在Google Colab中通过Python连接Apache Jena Fuseki执行SPARQL查询?
问题原因
你代码里的http://localhost:3030/Quran/sparql指向的是Colab云端虚拟机的本地地址,而你的Apache Jena Fuseki运行在自己的本地设备上,两者不在同一个网络环境,因此Colab无法连接到你本地的Fuseki服务,导致出现Cannot assign requested address错误。
两种可行解决方案
方案一:在Colab虚拟机内部部署Fuseki并加载本体
直接在Colab的云端虚拟机里安装、启动Fuseki,上传你的本体文件后进行查询,步骤如下:
安装Apache Jena Fuseki
在Colab单元格中运行以下命令下载并解压Fuseki:!wget https://dlcdn.apache.org/jena/binaries/apache-jena-fuseki-4.9.0.tar.gz !tar -xzf apache-jena-fuseki-4.9.0.tar.gz后台启动Fuseki服务
使用nohup让Fuseki在后台运行,避免阻塞Colab:!cd apache-jena-fuseki-4.9.0 && nohup ./fuseki-server &上传本体文件到Colab
点击Colab左侧面板的「文件」图标,选择「上传到会话存储」,把你的本体文件(比如quran-ontology.ttl)上传到Colab虚拟机中。创建数据集并加载本体
使用Fuseki的命令行工具tdbloader加载本体到名为Quran的数据集:!cd apache-jena-fuseki-4.9.0 && ./tdbloader --loc=databases/Quran /content/quran-ontology.ttl(注意替换
/content/quran-ontology.ttl为你实际上传的本体文件路径)执行原有查询代码
此时Fuseki运行在Colab自己的虚拟机里,你的原有SPARQL查询代码可以直接运行,无需修改端点地址。
方案二:将本地Fuseki暴露给公网供Colab访问
如果你想继续使用本地的Fuseki服务,可以通过内网穿透工具把本地3030端口映射到公网,步骤如下:
本地启动Fuseki并开放端口
确保本地Fuseki正常运行,并且电脑防火墙允许3030端口的入站连接。使用内网穿透工具映射端口
下载ngrok并运行以下命令(替换3030为你的Fuseki端口):./ngrok http 3030运行后会生成一个公网URL(比如
https://abc123.ngrok.io)。修改Colab代码中的SPARQL端点
将代码里的http://localhost:3030/Quran/sparql替换为ngrok生成的公网URL,比如:sparql = SPARQLWrapper('https://abc123.ngrok.io/Quran/sparql')之后即可正常执行查询。
注意:使用内网穿透时,公网URL会定期变化,且要注意数据安全,查询完成后建议关闭ngrok和Fuseki的公网访问。
内容的提问来源于stack exchange,提问作者Reem

