给定一个RDF::URI
和SPARQL属性路径(作为字符串存储),我想找到满足以下查询值
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
的例子吗?
从我的理解,您认为串插是“hackish的”因为你想处理“的东西,而不是字符串”。 这个愿望是绝对不会在语义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
不同的是,你不需要在第三种情况下字符串操作。
这些“运营商”甚至还有的URI(如Operator[:project]
)。