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 块,您可以将属性全部写在同一个地方),并且可能会让您担心的行数更少。缺点是您必须处理输出并查看每一行中的 属性;每个 属性 值都没有单独的列。
是否有更好的方法来表达以下使用多个 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 块,您可以将属性全部写在同一个地方),并且可能会让您担心的行数更少。缺点是您必须处理输出并查看每一行中的 属性;每个 属性 值都没有单独的列。