将SPARQL DESCRIBE查询重写为CONSTRUCT

时间:2011-06-08 11:23:20

标签: sparql redland

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

2 个答案:

答案 0 :(得分:3)

您的权利不是有效的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的所有信息。

答案 1 :(得分:3)

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

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

我在DBPedia(~2.46 billion triples)上用电影试了一下,看起来表现不错。

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

sparql result on dbpedia


编辑:仅仅为了附加信息,我认为您在技术上也可以写下以下内容:

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

但是一些流行的RDF数据库真的无法正常处理OPTIONAL,并且会死掉。