从属性路径创建模式

时间:2017-11-10 17:26:54

标签: ruby sparql rdf

给定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

1 个答案:

答案 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])。