给定RDF::URI
和SPARQL属性路径(存储为String),我想找到满足以下查询的值
SELECT ?value WHERE {
<URI> <property_path> ?value .
}
我设法使用以下代码段,但感觉非常 hackish:
query = SPARQL.parse(<<~QUERY)
SELECT ?value WHERE {
<#{uri}> #{property_path} ?value
}
QUERY
graph.query(query)
有没有更好的方法来实现这一点,例如使用RDF::Query
?
答案 0 :(得分:1)
根据我的理解,你认为字符串插值是&#34; hackish&#34;因为你想处理事情,而不是字符串&#34;。在语义Web相关领域,这种愿望绝对不值得谴责。
如果是这样,您可以使用SPARQL::Algebra
构建查询。
以下所有摘录都具有相同的含义:
SPARQL查询(q1
)
SELECT ?value WHERE {
<http://example.org/green-goblin>
<http://www.w3.org/2000/01/rdf-schema#label>|<http://xmlns.com/foaf/0.1/name>
?value .
}
SPARQL代数表达式(q2
)
(project
?value
(path
<http://example.org/green-goblin>
(alt
<http://www.w3.org/2000/01/rdf-schema#label>
<http://xmlns.com/foaf/0.1/name>
)
?value
)
)
Ruby代码(q3
)
Operator::Project.new(
Variable(:value),
Operator::Path.new(
RDF::URI('http://example.org/green-goblin'),
Operator::Alt.new(
RDF::URI('http://www.w3.org/2000/01/rdf-schema#label'),
RDF::URI('http://xmlns.com/foaf/0.1/name')
),
Variable(:value)
)
)
比较内部表示或查询结果:
require 'rubygems'
require 'sparql'
require 'sparql/algebra'
include SPARQL::Algebra
query1 = SPARQL.parse(q1)
query2 = SPARQL::Algebra::Expression.parse(q2)
query3 = eval(q3)
puts query1.to_sxp
puts query2.to_sxp
puts query3.to_sxp
query1.execute(queryable) do |result|
puts result.inspect
end
query2.execute(queryable) do |result|
puts result.inspect
end
query3.execute(queryable) do |result|
puts result.inspect
end
不同之处在于你在第三种情况下不需要字符串操作
这些&#34;运营商&#34;甚至有URI(例如Operator[:project]
)。