Sparql 可选属性

Sparql optional properties

是否有更好的方法来表达以下使用多个 optional 的查询?当有很多属性时,这很快就会变得容易出错。

SELECT * WHERE {
  BIND(:London AS ?source)
  OPTIONAL{ ?source rdfs:label ?o .}
  OPTIONAL{?source rdfs:comment ?i . }
}

实际上,没有比这更好的了。我唯一不同的是使用 values 来指定 ?source 的值,而不是 bind:

select * where {
  values ?source { dbpedia:London }
  optional { ?source rdfs:label   ?o }
  optional { ?source rdfs:comment ?i }
}

如果您愿意以稍微不同的方式处理您的数据,您也可以使用一个查询,其中属性是用值指定的:

select * where {
  values ?source { dbpedia:London }
  values ?property { rdfs:label rdfs:comment }
  ?source ?property ?value
}

当然,如果您这样做,则可以用列数换取行数,但如果任何属性有多个值,您仍然可能会更好。例如,在第一种情况下,如果 London 只有一个标签和一条评论,您会得到:

source    label        commment
------------------------------------
London    "the label"  "the comment"

但是如果你有两个标签和三个评论,你将有六(=二×三)行:

source    label     commment
------------------------------------
London    "label1"  "comment1"
London    "label1"  "comment2"
London    "label1"  "comment3"
London    "label2"  "comment1"
London    "label2"  "comment2"
London    "label2"  "comment3"

在第二种情况下,如果你有一个标签和一条评论,你有两行:

source    property      value 
------------------------------------
London    rdfs:label    "label1"
London    rdfs:comment  "comment1"

但是如果你有两个标签和三个评论,你最终只有五 (= 2 + 3) 行:

source    property      value 
------------------------------------
London    rdfs:label    "label1"
London    rdfs:label    "label2"
London    rdfs:comment  "comment1"
London    rdfs:comment  "comment2"
London    rdfs:comment  "comment3"

因此,如果属性可以有多个值(在 DBpedia 数据中很常见),使用 values 枚举您想要的属性可能不太容易出错(没有 optional 块,您可以将属性全部写在同一个地方),并且可能会让您担心的行数更少。缺点是您必须处理输出并查看每一行中的 属性;每个 属性 值都没有单独的列。