gpt4 book ai didi

containers - Sparql查询集合和rdf :containers?

转载 作者:行者123 更新时间:2023-12-04 11:26:26 26 4
gpt4 key购买 nike

大家好,所有rdf/sparql开发人员。这是一个困扰了我一段时间的问题,但是自从发布rdf和sparql规范以来,似乎没人能准确回答这个问题。

为了说明这种情况,RDF定义了几种方法来处理资源的多值属性。从使用相同子谓词uri创建尽可能多的三元组到集合或容器。这很好,因为每种模式都有其自己的特征。

但是从SPARQL的角度来看,在我看来,查询这些结构会导致过于复杂的查询(更糟糕的是)无法转化为合理的结果集:您无法使用变量来查询任意长度,而propertyPath确实可以不保留“自然”顺序。

以一种幼稚的方式,在许多SELECT或ASK查询中,如果我要查询或过滤容器或列表的值,我将不会在大多数时候关心底层模式的真正含义(如果有的话)。因此,例如:

<rdf:Description rdf:about="urn:1">
<rdfs:label>
<rdf:Alt>
<rdf:li xml:lang="fr">Exemple n°1</rdf:li>
<rdf:li xml:lang="en">Example #1</rdf:li>
</rdf:Alt>
</rdfs:label>
<my:release>
<rdf:Seq>
<rdf:li>10.0</rdf:li>
<rdf:li>2.4</rdf:li>
<rdf:li>1.1.2</rdf:li>
<rdf:li>0.9</rdf:li>
</rdf:Seq>
</my:release>
</rdf:Description>

<rdf:Description rdf:about="urn:2">
<rdfs:label xml:lang="en">Example #2</rdfs:label>
</rdf:Description>

显然,我希望这两种资源都能回答该查询:
SELECT ?res WHERE { ?res rdfs:label ?label . FILTER ( contains(?label, 'Example'@en) }

我也希望查询:
SELECT ?ver WHERE { <urn:1> my:release ?ver }

以原始顺序返回rdf:Seq元素(或该问题的任何rdf:Alt)(对于其他模式,是否保留原始顺序无关紧要,为什么无论如何都不要保留它?)-除非明确指定通过ORDER BY子句。

当然,有必要保持与旧方法的兼容性,因此也许可能是用新的运算符扩展propertyPath语法?

我觉得这将简化很多日常的SPARQL用例。

这对您有意义吗?
此外,您看到任何理由不尝试执行此操作吗?

编辑更正了示例的urn:2 rdfs:label值不正确的问题

最佳答案

RDF为集合和容器定义了词汇表,但是就如何解释包含它们的图而言,它们没有特殊意义。它们不适合也不是真正适合表示多值属性。

一般说:

:A :predicate [ a rdf:Alt ; rdf:_1 :B ; rdf:_2 :C ] .

不等于
:A :predicate :B , :C .

假设谓词是owl:sameAs:
:A owl:sameAs [ a rdf:Alt ; rdf:_1 :B ; rdf:_2 :C ] .

上面说::A命名包含:B和:C的个人,而:
:A owl:sameAs :B , :C .

说:A,:B和:C是同一个人。

SPARQL与容器和集合无关(除了rdf:List的语法缩写)。如果您想要使用集合的更方便的方法,则许多RDF API(包括 Jenardflib)都具有一流的表示形式。

附录

建模多值属性的方法(即建模“Example n°1” @fr和“Example#1” @en都是urn:1的标签)的方法是简单说明以下两个事实:
<rdf:Description rdf:about="urn:1">
<rdfs:label xml:lang="fr">Exemple n°1</rdfs:label>
<rdfs:label xml:lang="en">Example #1</rdfs:label>
...
</rdf:Description>

和查询:
SELECT ?res WHERE { ?res rdfs:label ?label . FILTER ( contains(?label, 'Example'@en) ) }

将与 的英文标签匹配。

对于my:release属性,其中有一个多值属性并按其值顺序排序,这有点棘手。您可以定义一个新属性,例如my:releases,其值为rdf:List或rdf:Seq。 my:release给出直接关系,而my:release给出指定显式顺序的间接关系。使用推理存储和适当的规则,您只需提供后者。不幸的是,这并没有使在SPARQL中使用排序变得更加容易。

在SPARQL和非推理存储中更容易使用的一种方法是使版本本身成为具有定义顺序的属性的对象:
  <rdf:Description rdf:about="urn:1">
<rdfs:label xml:lang="fr">Exemple n&#xB0;1</rdfs:label>
<rdfs:label xml:lang="en">Example #1</rdfs:label>
<my:release>
<my:Release>
<dc:issued rdf:datatype="&xsd;date">2008-10-10/dc:issued>
<my:version>10.0</my:version>
</my:Release>
</my:release>
<my:release>
<my:Release>
<my:version>2.4</my:version>
<dc:issued rdf:datatype="&xsd;date">2007-05-01</dc:issued>
</my:Release>
</my:release>
...
</rdf:Description>

在上面,由于不再有明确的序列,因此可以使用日期对结果进行排序。查询只是稍微复杂一点:
SELECT ?ver 
WHERE { <urn:1> my:release [ my:version ?ver ; dc:issued ?date ] }
ORDER BY ?date

关于containers - Sparql查询集合和rdf :containers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16223095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com