从属性路径创建模式 [英] Creating a pattern from a property path

查看:20
本文介绍了从属性路径创建模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆