Ruby RDF查询仅返回1条记录而非20条,请求诊断问题
排查Ruby RDF查询仅返回1条结果的问题
让我帮你梳理下可能导致这个问题的几个关键点,结合你的代码来看:
1. 不完整的查询谓词是重灾区
你给出的查询语句里,RDF::URI("http://o...")明显是截断了的URI,这会导致查询只能匹配到恰好包含这个不完整URI的资源,大概率只有1条。
如果你的目标是查询所有类型为Appeal的资源,应该补全完整的谓词和类型URI,比如用RDF.type来匹配资源类型:
query = RDF::Query.new({ :appeal => { RDF.type => RDF::URI("http://opendatacommunities.org/def/ontology/planning/pins/Appeal") } })
2. 检查数据集加载是否真的拿到了20条记录
你加载数据集的URL里用了&,这是HTML转义后的&字符,Ruby在发起HTTP请求时可能不会自动解析这个转义,导致服务器无法正确识别per_page=20这类参数,最终只返回默认的1条数据。
先修正URL里的转义字符,把&换成&:
graph = RDF::Graph.load("http://opendatacommunities.org/resources_in_dataset.jsonld?dataset=planning-inspectorate-casework&page=1&per_page=20&type_uri=http%3A%2F%2Fopendatacommunities.org%2Fdef%2Fontology%2Fplanning%2Fpins%2FAppeal")
之后可以先验证加载的图里到底有多少目标资源:
appeal_type = RDF::URI("http://opendatacommunities.org/def/ontology/planning/pins/Appeal") total_appeals = graph.query({:s => :appeal, :p => RDF.type, :o => appeal_type}).count puts "实际加载了#{total_appeals}条申诉记录"
如果这里输出是1,那问题出在数据集加载环节;如果是20,再去排查查询语句。
3. 确认结果迭代的方式是否正确
有时候不是查询的问题,而是你只取了第一个结果而非遍历所有结果。确保你是这样迭代查询结果的:
query.execute(graph).each do |result| puts "找到申诉资源:#{result[:appeal]}" end
如果用了query.execute(graph).first,那自然只会拿到1条记录。
内容的提问来源于stack exchange,提问作者arnoldtm
相关产品推荐
相关产品推荐

