从属性路径创建模式 [英] 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
?
推荐答案
根据我的理解,您认为字符串内插是"黑客行为",因为您希望处理"事物,而不是字符串"。在与语义网相关的领域中,这种愿望绝对不应受到谴责。
如果是这样,您可以使用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]
)。
这篇关于从属性路径创建模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文