我想知道DBpedia上两个实体之间是否存在属性路径。这是我在snorql
上尝试的示例查询:
SELECT * WHERE {
:Braveheart (:|!:)* :Mel_Gibson
}
LIMIT 100
查询遇到内存错误:
Virtuoso 42000 Error TN...: Exceeded 1000000000 bytes in transitive temp memory. use t_distinct, t_max or more T_MAX_memory options to limit the search or increase the pool SPARQL query: define sql:big-data-const 0 #output-format:application/sparql-results+json define input:default-graph-uri PREFIX owl: PREFIX xsd: PREFIX rdfs: PREFIX rdf: PREFIX foaf: PREFIX dc: PREFIX : PREFIX dbpedia2: PREFIX dbpedia: PREFIX skos: SELECT * WHERE { :Braveheart (:|!:)* :Mel_Gibson } LIMIT 100
我怀疑有人会建议设置本地dbpedia镜像。如果是这样的话,我会喜欢一些关于如何做的详细步骤。
答案 0 :(得分:0)
我认为您的查询对于您尝试回答的内容有点不对...也因为其中没有变量select *
无法预测任何内容(i' d认为这甚至是编译它的错误),所以让我rephrase your query到
ASK { dbr:Braveheart (<>|!<>)+ dbr:Mel_Gibson }
可悲的是,查询错误时遇到了与您描述的问题相同的问题。
虽然我同意,复杂应该针对本地端点执行,但上述查询根本不复杂,特别是考虑到有几个direct edges between the two nodes:
SELECT * { dbr:Braveheart ?p dbr:Mel_Gibson }
我认为这是Virtuoso的查询规划器中的一个错误并报告了它:https://github.com/openlink/virtuoso-opensource/issues/641
说了这么多,我想指出,在实际情况下,你可能对那些不仅仅指向前进的道路感兴趣。边缘的方向很大程度上取决于建模。因此,请考虑使用类似这样的查询:
ASK { dbr:Braveheart ((<>|!<>)|^(<>|!<>))+ dbr:Mel_Gibson }
表达式表示至少在一个步骤中沿着它们的方向或任何边缘(^
)。 (是的,我也想知道为什么属性路径不是任意边的短语法;))
答案 1 :(得分:0)
转发@JörnHees的回答,有几点:
<>
是无效的谓词标识符。对于Virtuoso,<>
标识了一个文档(在HTTP 200 OK
上返回GET
的内容位置),这就是<#>
或<#this>
工作的原因。这不是解析问题,因为它更多地与标识符的语义有关。
公共DBpedia端点未配置为接受此类查询,因此出现错误。
使用<#this>
而不是<>
,我们有 -
prefix dbpedia: <http://dbpedia.org/resource/>
ASK { dbpedia:Braveheart (<#this>|!<#this>)+ dbpedia:Mel_Gibson }
两个替代实例,由OpenLink Software(我的雇主和Virtuoso的制作人)托管,为该查询提供解决方案: