SPARQL:在值列表中测试现有谓词,生成笛卡尔乘积

时间:2019-09-16 13:14:17

标签: sparql cartesian

我正在尝试测试给定资源的现有关系(对象属性)。

让我们举一个例子:

我想知道主题?a的谓词是否具有sparql变量?b中的值之一。 因此,?a可以包含一个uuid(或您想要的,但这是我的情况),而?b包含一个资源列表(:hot:cold:good )。 如果我的变量?a至少有一个链接与我的变量?b的值,则sparql不必返回它。

问题是sparql返回我的变量?a 3次。如果?b包含10个资源,它将返回?a 10次。 是否有可能在SPARQL中“一言以蔽之”或用ASK语句进行子查询。

SELECT * WHERE { 
    ?donnee a capt:VALEUR .             
    ?donnee tag:Est ?tag .
    ?modele tag:Modelisé_Avec ?tag .
    ?tag tag:A_Pour_Père/tag:Qualifié_Par ?qual .
    ?qualif tag:A_Pour_Père ?qual .
    FILTER (?modele = tag:Modèle_qualification_température_intérieure) .
    FILTER NOT EXISTS {?donnee tag:Qualifié_Par ?qualif .}
}

问题与?qualif变量有关。 谢谢。

编辑:根据要求,您可以在此处看到一些详细信息。

  • 我的目标是获取与?qual => ?qualif:Chaud:Doux:Frais个资源。
  • 用自然语言(英语不好;)):让我获取所有未用:Froid变量中包含的?qualif之一标记的值。如果数据已被标记,请不要将其返回。
  • 问题是我的三元组中有2307个值,结果为9227。为什么?我认为是因为我的要求这样做:
    ?qual
    等等...具有所有值

Actual Result

正如您在这里看到的,有9227(-1)结果,但我有2307个值=> 2307x4。

您更清楚吗? 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

感谢您的回答。

“ Select *”语句是为了简化请求。但是我尝试了您的解决方案,但它不起作用。如果我添加“ Distinct”,是的。感谢那。 今天早晨,我找到了另一种不带“ DISTINCT”的解决方案:

SELECT ?donnee WHERE{ 
            ?modele tag:Modelisé_Avec ?tag .
            ?donnee tag:Est ?tag .
            ?tag tag:A_Pour_Père/tag:Qualifié_Par ?qual .
            FILTER (?tag = tag:Température_intérieure)  .   
            FILTER NOT EXISTS { ?donnee tag:Qualifié_Par ?qualif .
                                ?qualif tag:A_Pour_Père ?qual . }}

我在“ FILTER NOT EXISTS”中放置了“?qualif tag:A_Pour_Père?qual”,而不是“ SELECT”,它在没有“ DISTINCT”和“ SELECT *”的情况下也有效 感谢您的宝贵时间。