从 属性 路径创建模式
Creating a pattern from a property path
给定 RDF::URI
和 SPARQL 属性 路径(存储为字符串),我想找到满足以下查询的值
SELECT ?value WHERE {
<URI> <property_path> ?value .
}
我设法通过使用以下代码段获得,但感觉 非常 骇人听闻:
query = SPARQL.parse(<<~QUERY)
SELECT ?value WHERE {
<#{uri}> #{property_path} ?value
}
QUERY
graph.query(query)
是否有更好的方法来实现此目的,例如使用 RDF::Query
?
据我了解,您认为字符串插值是 "hackish",因为您想处理 "things, not strings"。这种愿望在语义网相关领域绝对不可指责。
如果是这样,您可以使用 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
区别在于第三种情况不需要字符串操作。
这些 "operators" 甚至有 URI(例如 Operator[:project]
)。
给定 RDF::URI
和 SPARQL 属性 路径(存储为字符串),我想找到满足以下查询的值
SELECT ?value WHERE {
<URI> <property_path> ?value .
}
我设法通过使用以下代码段获得,但感觉 非常 骇人听闻:
query = SPARQL.parse(<<~QUERY)
SELECT ?value WHERE {
<#{uri}> #{property_path} ?value
}
QUERY
graph.query(query)
是否有更好的方法来实现此目的,例如使用 RDF::Query
?
据我了解,您认为字符串插值是 "hackish",因为您想处理 "things, not strings"。这种愿望在语义网相关领域绝对不可指责。
如果是这样,您可以使用 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
区别在于第三种情况不需要字符串操作。
这些 "operators" 甚至有 URI(例如 Operator[:project]
)。