优化SPARQL查询以加载SAMPLE标签

时间:2016-04-05 21:31:43

标签: sparql rdf virtuoso

以下查询从我的数据集加载合同(合同在组织和合作伙伴之间)。

SELECT ?contract ?organisation ?partner
WHERE {
    ?organisation
        a gr:BusinessEntity ;
        rejstriky:contract ?contract .

    ?contract a rejstriky:Contract ;
        rejstriky:partner ?partner .
}
GROUP BY ?contract ?organisation ?partner

此查询返回大约8000个合约,并立即执行此操作(仅需几分之一秒)。现在我需要为组织和合作伙伴加载标签/名称。可能有多个名称,我只需要一个。这是我的问题:

SELECT ?contract ?organisation ?partner
    (SAMPLE(?organisationNames) AS ?organisationName)
    (SAMPLE(?partnerNames) AS ?partnerName)
WHERE {
    ?organisation
        a gr:BusinessEntity ;
        rejstriky:contract ?contract .

    ?contract a rejstriky:Contract ;
        rejstriky:partner ?partner .

    ?organisation gr:legalName ?organisationNames .
    ?partner gr:legalName ?partnerNames .
}
GROUP BY ?contract ?organisation ?partner

此查询突然需要几分钟才能完成

我做了一些实验,我发现如果我决定使用单独的SPARQL调用获取所有名称(在一个批次中使用40个名称),则需要不到2分钟(这会快得多)。无论如何,如果我能够在几分之一秒内生成这8000个项目,为每个项目加载两个标签不应该花那么长时间。

您对如何优化查询有任何想法吗?请注意,我正在使用Virtuoso。

1 个答案:

答案 0 :(得分:0)

无法访问样本数据或Virtuoso很难确定这是否有用,但您可以尝试避免使用SAMPLE。

 SELECT ?contract ?organisation ?organisationName ?partner ?partnerName

WHERE {
    ?organisation
        a gr:BusinessEntity ;
        rejstriky:contract ?contract .

    ?contract a rejstriky:Contract ;
        rejstriky:partner ?partner .

   { SELECT ?organisationName WHERE { ?organisation gr:legalName ?organisationName . } LIMIT 1}
   { SELECT ?partnerName WEHRE {?partner gr:legalName ?partnerName . } LIMIT 1}
}
GROUP BY ?contract ?organisation ?organisationName ?partner ?partnerName