SPARQL中的递归查询以浏览集合的集合

ghu*_*ill 8 database rdf sparql

我试图从Mulgara RDF商店创建一个RDF图,使用Sparql查询返回结果.我刚开始对简单的查询感到满意,有效地问,"哪些对象是特定集合的成员?"

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

例如,我有这个sparql查询:

SELECT ?x WHERE {?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>}
Run Code Online (Sandbox Code Playgroud)

有了这些结果:

"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
...
Run Code Online (Sandbox Code Playgroud)

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

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

Sparql查询可以实现吗?具体来说,我相信我正在查询Mulgara RDF数据库.任何想法,即使它"不可行",也非常感激.

Man*_*res 14

让我们假设你必须坚持使用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
}
Run Code Online (Sandbox Code Playgroud)

这里?y将绑定您的根目录中的第二级元素.使用UNIONS,您可以使用一个查询查询多个级别.一个查询中root的一个和两个级别的示例:

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 .
     }
}
Run Code Online (Sandbox Code Playgroud)

这个问题是你真的不知道?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)
     }
}
Run Code Online (Sandbox Code Playgroud)

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

SELECT ?x WHERE {
    ?x  <fedora-rels-ext:isMemberOfCollection>+ <info:fedora/collection:ramsey> .
}
Run Code Online (Sandbox Code Playgroud)

您将绑定通过谓词?x可到达的所有节点.<info:fedora/collection:ramsey><fedora-rels-ext:isMemberOfCollection>

  • 先生,您是位学者和先生,非常感谢。这正是我希望学习的东西,并为我提供了很多饲料。 (2认同)