gpt4 book ai didi

Ruby RDF 查询——从 Seq 和 Bag 项中提取简单数据

转载 作者:数据小太阳 更新时间:2023-10-29 07:34:18 26 4
gpt4 key购买 nike

我正在接收 xml 序列化的 RDF(作为 XMP 媒体描述的一部分,以防相关),并在 Ruby 中进行处理。我正在尝试使用 rdf gem,尽管很高兴看到其他解决方案。

我已设法加载和查询最基本的数据,但在尝试为包含序列和包的项目构建查询时卡住了。

示例 XML RDF:

<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<rdf:Description rdf:about='' xmlns:dc='http://purl.org/dc/elements/1.1/'>
<dc:date>
<rdf:Seq>
<rdf:li>2013-04-08</rdf:li>
</rdf:Seq>
</dc:date>
</rdf:Description>
</rdf:RDF>

我最好的组合查询的尝试:

require 'rdf'
require 'rdf/rdfxml'
require 'rdf/vocab/dc11'

graph = RDF::Graph.load( 'test.rdf' )

date_query = RDF::Query.new( :subject => { RDF::DC11.date => :date } )

results = date_query.execute(graph)

results.map { |result| { result.subject.to_s => result.date.inspect } }

=> [{"test.rdf"=>"#<RDF::Node:0x3fc186b3eef8(_:g70100421177080)>"}]

我的印象是我在这个阶段的结果(“查询解决方案”?)是对 rdf:Seq 容器的引用。但是我不知道如何进步。对于上面的示例,我希望最终得到一个数组 ["2013-04-08"]

当传入数据没有 rdf:Seqrdf:li 容器时,我可以使用 RDF::Query 提取我想要的字符串,以下示例位于 http://rdf.rubyforge.org/RDF/Query.html - 遗憾的是,我找不到任何用 Ruby 处理的更复杂查询或 RDF 结构的示例。

编辑:此外,当我试图找到与 RDF::Node 对象一起使用的适当方法时,我看不出有任何方法可以探索它可能具有的任何进一步关系:

results[0].date.methods - Object.methods
=> [:original, :original=, :id, :id=, :node?, :anonymous?, :unlabeled?, :labeled?, :to_sym, :resource?, :constant?, :variable?, :between?, :graph?, :literal?, :statement?, :iri?, :uri?, :valid?, :invalid?, :validate!, :validate, :to_rdf, :inspect!, :type_error, :to_ntriples]
# None of the above leads AFAICS to more data in the graph

我知道如何在 xpath 中获取相同的数据(好吧,至少假设我们总是在序列化中获取相同的路径),但感觉它不是在这种情况下使用的最佳查询语言(这是我的备份计划,但是,如果事实证明它太复杂而无法实现 RDF 查询解决方案)

最佳答案

我认为您说“我在这个阶段的结果(“查询解决方案”?)是对 rdf:Seq 容器的引用”是正确的。 RDF/XML 是一种非常可怕的序列化格式,而不是将数据视为图形。这是一张 RDF:Bag 的图片。 RDF:Seq 的工作原理相同,示例中的#students 类似于您案例中的#date。 RDF:Bag example, RDF:Seq is the same

因此,要获得日期文字,您需要在图中进一步跳一个节点。我不熟悉这个 Ruby 库的语法,但类似于:

require 'rdf'
require 'rdf/rdfxml'
require 'rdf/vocab/dc11'

graph = RDF::Graph.load( 'test.rdf' )

date_query = RDF::Query.new({
:yourThing => {
RDF::DC11.date => :dateSeq
},
:dateSeq => {
RDF.type => RDF.Seq,
RDF._1 => :dateLiteral
}
})

date_query.execute(graph).each do |solution|
puts "date=#{solution.dateLiteral}"
end

当然,如果您希望 Seq 实际上包含多个日期(否则使用 Seq 就没有意义),您必须将它们与 RDF._1 => :dateLiteral1, RDF._2 => :dateLiteral2, RDF._3 => :dateLiteral3

或者对于更通用的解决方案,将 dateSeq 上的所有属性和对象与:

:dateSeq => {
:property => :dateLiteral
}

然后过滤掉 :property 最终是 RDF:type:dateLiteral 实际上不是日期而是 RDF:序​​列。也许图书馆也有一个特殊的方法来获取所有 Seq 的内容。

关于Ruby RDF 查询——从 Seq 和 Bag 项中提取简单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15899961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com