8

我正在尝试从 Mulgara RDF 存储创建 RDF 图,使用 Sparql 查询返回结果。我刚刚开始熟悉简单的查询,有效地询问“哪些对象是特定集合的成员?”

我的问题是,我非常感谢任何建议,我是否可以从这个简单的查询中获取结果并将它们重新路由回作为查询的对象?

例如,我有这个 sparql 查询:

SELECT ?x WHERE {?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>}

有了这些结果:

"x"
info:fedora/ramsey:ThelifeandadventuresofRobinsonCrusoe 
info:fedora/ramsey:Jackanapes 
info:fedora/ramsey:SundayJournalvol01no0219951126 
info:fedora/ramsey:Ideologyandchange 
info:fedora/ramsey:theshepherdofthepyrenees 
info:fedora/ramsey:ScenesinAmerica
...

我的目标是从原始查询中获取这些唯一标识符并替换对象 ,<info:fedora/collection:ramsey>并再次运行查询。

我正在想象一个场景,我将在初始查询中识别一个根元素,让结果返回所有成员对象,然后返回所有这些对象的成员对象,无穷无尽......

Sparql 查询可以做到这一点吗?具体来说,我相信我正在查询一个 Mulgara RDF 数据库。任何想法,即使它不可行,也非常感谢。

4

1 回答 1

16

假设您必须坚持使用 SPARQL 1.0。我相信 mulgara 对 SPARQL 1.1 的支持有限(如果有的话)。

使用 SPARQL 1.0,如果您可能知道要查询多少级别,您可以执行以下操作:

SELECT ?y WHERE {
        ?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>
        ?y  <fedora-rels-ext:isMemberOfCollection> ?x
}

这里?y将与您的根目录中的 2 级元素绑定。使用 UNIONS,您可以一次查询多个级别。一个查询中从根开始的一级和二级的示例:

SELECT ?x WHERE {
     {
        ?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> .
     } UNION {
        ?zz  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>
        ?x  <fedora-rels-ext:isMemberOfCollection> ?zz .
     }
}

这样做的问题是您并不真正知道在什么级别?x上受到约束。因此,您不能使用这种类型的查询绘制树。在 SPARQL 1.1 中,这可以通过BIND AS解决

SELECT ?x ?level WHERE {
     {
        ?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> .
        BIND (1 AS ?level)
     } UNION {
        ?zz  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>
        ?x  <fedora-rels-ext:isMemberOfCollection> ?zz .
        BIND (2 AS ?level)
     }
}

第二个查询将返回?x绑定的级别。您可以想象一些以编程方式生成的查询,其中有许多联合试图达到树的最大深度。如果您想完全支持 SPARQL 1.1,可以尝试使用Jena/ARQ。在 Jena 中,您还可以使用属性路径和类似以下内容:

SELECT ?x WHERE {
    ?x  <fedora-rels-ext:isMemberOfCollection>+ <info:fedora/collection:ramsey> .
}

您将绑定通过 predicate?x可访问的所有节点。<info:fedora/collection:ramsey><fedora-rels-ext:isMemberOfCollection>

于 2013-02-26T02:22:37.110 回答