出于某种原因,我无法使用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> }
}
}
答案 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 )
方法之后,我觉得它很慢。
我认为你基本上可以做同样的事情,但是使用VALUES
和UNION
我在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 }
}
}
编辑:仅仅为了附加信息,我认为您在技术上也可以写下以下内容:
CONSTRUCT { ?subject ?predicate ?object }
WHERE {
?subject ?predicate ?object .
OPTIONAL { dbpedia:The_Matrix ?predicate ?object . }
OPTIONAL { ?subject ?predicate dbpedia:The_Matrix . }
}
但是一些流行的RDF数据库真的无法正常处理OPTIONAL
,并且会死掉。