Fuseki查询返回“No data available”但实际存在数据的问题排查
问题:Fuseki查询返回“无可用数据”但默认图可见数据
我在Fuseki UI中执行预定义查询:
SELECT ?subject ?predicate ?object WHERE { ?subject ?predicate ?object } LIMIT 25
返回“无可用数据”,但在编辑标签页点击默认图时能看到所有数据。已确认是配置问题,但未找到文档线索。
现有配置信息
Shiro匿名访问配置:
/**/query = anonFuseki端点配置(基础模式):
fuseki:endpoint [ fuseki:operation fuseki:query ; fuseki:name "sparql" ; ## Set default-union-graph for this endpoint. ja:context [ ja:cxtName "tdb:unionDefaultGraph" ; ja:cxtValue true ] ; ] ; fuseki:endpoint [ fuseki:operation fuseki:query ; fuseki:name "query" ] ;Docker Compose配置:
version: '3' services: web: image: tomcat:9.0 ports: - "8081:8080" volumes: - ./logs/fuseki:/etc/fuseki/logs - ./logs/tomcat:/usr/local/tomcat/logs - ./triplestore/ROOT.war:/usr/local/tomcat/webapps/ROOT.war - ./shiro.ini:/etc/fuseki/shiro.ini - ./config.ttl:/etc/fuseki/config.ttl数据加载方式(Python脚本):
def write_to_fuseki(): print('write to fuseki') headers = {'Content-Type': 'text/turtle;charset=utf-8'} r = requests.put('http://localhost:8081/dataset/data?default',headers=headers, data=open('ontology/test.ttl', 'rb'), auth=('user', 'pw'))
补充信息
- 通过HTTP请求
http://localhost:8081/dataset/data?default可获取包含所有数据的ttl文件; - 已尝试WebUI和curl查询,结果一致,仅HTTP下载数据正常。
排查思路
检查端点默认图配置差异
当前sparql端点开启了tdb:unionDefaultGraph,但query端点未配置。Fuseki UI默认使用/dataset/query端点,尝试直接访问/dataset/sparql端点执行查询,看是否返回结果。若确实是端点配置问题,给query端点添加相同的联合图配置:fuseki:endpoint [ fuseki:operation fuseki:query ; fuseki:name "query" ; ja:context [ ja:cxtName "tdb:unionDefaultGraph" ; ja:cxtValue true ] ; ] ;显式指定默认图查询
在SPARQL查询中显式指定默认图范围,验证是否能获取数据:SELECT ?subject ?predicate ?object WHERE { GRAPH <urn:x-arq:DefaultGraph> { ?subject ?predicate ?object } } LIMIT 25对比两个端点的查询结果
用curl分别测试两个端点,确认配置差异的影响:- 测试
sparql端点:curl -X POST http://localhost:8081/dataset/sparql --data-urlencode "query=SELECT ?s ?p ?o WHERE { ?s ?p ?o } LIMIT 25" - 测试
query端点:curl -X POST http://localhost:8081/dataset/query --data-urlencode "query=SELECT ?s ?p ?o WHERE { ?s ?p ?o } LIMIT 25"
- 测试
查看Fuseki日志排查错误
检查挂载的./logs/fuseki目录下的日志文件,查看执行查询时是否有权限、图访问相关的错误提示。验证数据加载的完整性
确认Python脚本的PUT请求返回状态码是否为200/201,可尝试改用POST请求追加数据(PUT会替换整个默认图的数据,可能导致数据覆盖):r = requests.post('http://localhost:8081/dataset/data?default', headers=headers, data=open('ontology/test.ttl', 'rb'), auth=('user', 'pw'))
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

