在 SPARQL 中使 UNION return 成为单个结果
Make a UNION return a single result in SPARQL
我正在尝试查询 属性 形状的 sh:description
,如果有 none,我想沿着路径找到 属性 并且获取 rdfs:comment
(也适用于 sh:name
和 rdfs:label
)。我的数据如下所示:
ex:File
a owl:Class ;
a sh:NodeShape ;
sh:property ex:File-name ;
ex:File-name
a sh:PropertyShape ;
sh:path ex:filename ;
sh:datatype xsd:string ;
sh:description "The name of the file" ;
sh:maxCount 1 ;
ex:filename
a rdf:Property ;
rdfs:label "Filename" ;
rdfs:comment "The file name" ;
.
我有下面的查询,但它 return 有两个结果。我怎样才能将它修改为只有 return 个结果(更喜欢 sh:description
而不是 rdfs:comment
)?
PREFIX : <http://www.example.org/#>
PREFIX sh: <http://www.w3.org/ns/shacl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?propertyShape ?property ?name ?description where {
:File sh:property ?propertyShape .
?propertyShape sh:path ?property .
{ ?propertyShape sh:name ?name } UNION { ?property rdfs:label ?name } .
{ ?propertyShape sh:description ?description } UNION { ?property rdfs:comment ?description } .
上面的return是这样的:
propertyShape
property
name
description
:File-name
ex:filename
"Filename"
"The name of the file"
:File-name
ex:filename
"Filename"
"The file name"
我希望它 return 类似于:
propertyShape
property
name
description
:File-name
ex:filename
"Filename"
"The name of the file"
您应该能够使用一系列 OPTIONAL
块来执行此操作:
SELECT ?propertyShape ?property ?name ?description WHERE {
:File sh:property ?propertyShape .
?propertyShape sh:path ?property .
OPTIONAL { ?propertyShape sh:name ?name }
OPTIONAL { ?property rdfs:label ?name }
OPTIONAL { ?propertyShape sh:description ?description }
OPTIONAL { ?property rdfs:comment ?description }
}
你仍然需要考虑每个 属性 有多个 names/descriptions 的情况(这不能保证 return 只有一个结果),但它应该给你“更喜欢sh:description而不是rdfs:comment”的行为。
你不能只使用路径表达式,例如
...
?propertyShape sh:name|(sh:path/rdfs:label) ?name .
?propertyShape sh:description|(sh:path/rdfs:comment) ?description .
我正在尝试查询 属性 形状的 sh:description
,如果有 none,我想沿着路径找到 属性 并且获取 rdfs:comment
(也适用于 sh:name
和 rdfs:label
)。我的数据如下所示:
ex:File
a owl:Class ;
a sh:NodeShape ;
sh:property ex:File-name ;
ex:File-name
a sh:PropertyShape ;
sh:path ex:filename ;
sh:datatype xsd:string ;
sh:description "The name of the file" ;
sh:maxCount 1 ;
ex:filename
a rdf:Property ;
rdfs:label "Filename" ;
rdfs:comment "The file name" ;
.
我有下面的查询,但它 return 有两个结果。我怎样才能将它修改为只有 return 个结果(更喜欢 sh:description
而不是 rdfs:comment
)?
PREFIX : <http://www.example.org/#>
PREFIX sh: <http://www.w3.org/ns/shacl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?propertyShape ?property ?name ?description where {
:File sh:property ?propertyShape .
?propertyShape sh:path ?property .
{ ?propertyShape sh:name ?name } UNION { ?property rdfs:label ?name } .
{ ?propertyShape sh:description ?description } UNION { ?property rdfs:comment ?description } .
上面的return是这样的:
propertyShape | property | name | description |
---|---|---|---|
:File-name | ex:filename | "Filename" | "The name of the file" |
:File-name | ex:filename | "Filename" | "The file name" |
我希望它 return 类似于:
propertyShape | property | name | description |
---|---|---|---|
:File-name | ex:filename | "Filename" | "The name of the file" |
您应该能够使用一系列 OPTIONAL
块来执行此操作:
SELECT ?propertyShape ?property ?name ?description WHERE {
:File sh:property ?propertyShape .
?propertyShape sh:path ?property .
OPTIONAL { ?propertyShape sh:name ?name }
OPTIONAL { ?property rdfs:label ?name }
OPTIONAL { ?propertyShape sh:description ?description }
OPTIONAL { ?property rdfs:comment ?description }
}
你仍然需要考虑每个 属性 有多个 names/descriptions 的情况(这不能保证 return 只有一个结果),但它应该给你“更喜欢sh:description而不是rdfs:comment”的行为。
你不能只使用路径表达式,例如
...
?propertyShape sh:name|(sh:path/rdfs:label) ?name .
?propertyShape sh:description|(sh:path/rdfs:comment) ?description .