由于某些原因,我无法使用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 )
方法之后,我觉得它相当慢。
我认为你基本上可以做同样的事情,但使用VALUES
和UNION
我在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
,而且会消亡。