将SPARQLDESCRIBE查询重写为CONSTRUCT



由于某些原因,我无法使用Redland(librdf.org)发出DESCRIBE查询,是否可以将DESCRIBE重写为给定URI的CONSTRUCT QUERY?

DESCRIBE <urn:my-uri>

我想把它写成这样,但我认为这在SPARQL中无效

CONSTRUCT  { ?subject ?predicate ?object }
WHERE      { 
               { ?subject ?predicate ?object } 
               AND { 
                   { <urn:my-uri> ?predicate ?object } 
                   OR { ?subject <urn:my-uri> ?object } 
                   OR { ?subject ?predicate <urn:my-uri> } 
               } 
           }

您是对的,这不是一个有效的SPARQL。最接近OR的是UNION。而且,不需要AND运算符,默认情况下,每个三元组模式都是联接而不是并集。

对于您正在尝试的内容,最好使用FILTER,如以下示例:

CONSTRUCT  { ?subject ?predicate ?object }
WHERE      { ?subject ?predicate ?object . 
             FILTER (  ?subject = <urn:your_uri> || ?object = <urn:your_uri>)
           } 

在一些系统中,对于大型知识库,这种查询可能非常昂贵。此外,如果您的数据库包含bNodes,则此查询不会获得这些节点的描述,只会获得内部代码。在大多数情况下,手动运行DESCRIBE不是用一个查询就能完成的,您必须实现一些递归逻辑才能获得描述URI的所有信息。

在尝试了FILTER ( A || B )方法之后,我觉得它相当慢。

我认为你基本上可以做同样的事情,但使用VALUESUNION

我在DBPedia(约24.6亿三倍)上用一部电影尝试了一下,它似乎表现得很好。

CONSTRUCT {
    ?subject ?predicate ?object
}
WHERE {
   { ?subject ?predicate ?object . 
       VALUES ?subject { dbpedia:The_Matrix }
   }
   UNION 
   { ?subject ?predicate ?object . 
       VALUES ?object { dbpedia:The_Matrix }
   }
}

dbpedia 上的sparql结果


编辑:只是为了获得更多信息,我认为从技术上讲,你也可以写以下内容:

CONSTRUCT { ?subject ?predicate ?object }
WHERE {
       ?subject ?predicate ?object . 
       OPTIONAL { dbpedia:The_Matrix ?predicate ?object . }
       OPTIONAL { ?subject ?predicate dbpedia:The_Matrix . }
}

但一些流行的RDF数据库确实还不能很好地处理OPTIONAL,而且会消亡。

相关内容

  • 没有找到相关文章

最新更新