4

出于某种原因,我无法使用 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> } 
               } 
           }
4

2 回答 2

3

在尝试了类似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,并且会死掉。

于 2014-01-29T23:07:07.553 回答
3

你是对的,它不是一个有效的 SPARQL。最接近您的ORUNION. 而且,不需要AND运算符,默认情况下,每个三元组模式都是连接而不是联合。

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

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

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

于 2011-06-08T12:16:30.100 回答