2

我正在使用以下 SPARQL 查询,这是我机构 SPARQL 端点的基于 Web 端的示例;

SELECT ?building_number ?name ?occupants WHERE {
  ?site a org:Site ;
        rdfs:label "Highfield Campus" .

  ?building spacerel:within ?site ;
            skos:notation ?building_number ;
            rdfs:label ?name .

  OPTIONAL {
    ?building soton:buildingOccupants ?occ .
    ?occ rdfs:label ?occupants .
  } .
} ORDER BY ?name

问题是,除了从我感兴趣的数据集“建筑物和地点”获取数据外,它还从“设施和设备”数据集中获取数据,这是不相关的. 如果您点击链接,您应该会看到这一点。

我怀疑这个例子可能早于设施和设备数据集的添加,但即使我已经对 SPARQL 进行了研究,我也看不出一个明确的方法来定义要包含哪些数据集。

谁能推荐一个起点来限制它只显示“建筑物”,或者更具体地说,是“建筑物和地点”数据集的结果。

谢谢

4

1 回答 1

4

首先,你真的需要使用 SELECT DISTINCT,否则你会得到重复的结果。

要回答您的问题,您可以使用 GRAPH { ... } 过滤 SPARQL 查询的某些部分,以仅匹配来自特定数据集的数据。这仅在 SPARQL 端点被划分为 GRAPH(这个是)时才有效。您要求的解决方案不是最佳选择,因为它假定“地点”数据集中的站点内的事物将始终被限制在建筑物中......这是有风险的——因为它最终可能会在某个时候包含树木和路标在将来。

第一步是找出正在使用的图表:

SELECT DISTINCT ?g1 ?building_number ?name ?occupants WHERE {
  ?site a org:Site ;
        rdfs:label "Highfield Campus" .

  GRAPH ?g1 { ?building spacerel:within ?site ;
            skos:notation ?building_number ;
            rdfs:label ?name .
            }

  OPTIONAL {
    ?building soton:buildingOccupants ?occ .
    ?occ rdfs:label ?occupants .
  } .
} ORDER BY ?name

在这里试试:http: //is.gd/WdRAGX

从这里你可以看到http://id.southampton.ac.uk/dataset/places/latesthttp://id.southampton.ac.uk/dataset/places/facilities是两个相关的。

要根据“地点”图仅在站点内查找事物,请使用: SELECT DISTINCT ?building_number ?name ?occupants WHERE { ?site a org:Site ; rdfs:label “海菲尔德校园”。

  GRAPH <http://id.southampton.ac.uk/dataset/places/latest> { 
        ?building spacerel:within ?site ;
            skos:notation ?building_number ;
            rdfs:label ?name .
            }

  OPTIONAL {
    ?building soton:buildingOccupants ?occ .
    ?occ rdfs:label ?occupants .
  } .
} ORDER BY ?name

替代解决方案:


使用 rdf:type

上面我已经回答了你的问题,但这不是你问题的答案。这个解决方案更具语义,因为它实际上说“只给我校园内的建筑物”,这就是你的真正意思。

除了按图形过滤,这不是很“语义”,您还可以将“建筑”限制为研究设施不是的“建筑”类。它们有时仍被列为“在”站点内。通常当大学只公布他们在哪个校区而不是哪个大楼时。

?building a rooms:Building 

使用过滤器

在极端情况下,您可能没有不同 GRAPHS 中的数据,并且可能没有优雅的关系来过滤您的结果。在这种情况下,您可以使用 FILTER 并将构建 URI 转换为字符串并使用正则表达式来匹配可接受的:

FILTER regex(str(?building), "^http://id.southampton.ac.uk/building/")  

这是迄今为止最糟糕的选择,如果必须,请不要使用它。


腰带和大括号

您可以一起使用这些限制中的任何一个,并结合限制 GRAPH 以及确保所有 ?buildings 确实是建筑物将是我推荐的解决方案。

于 2013-03-10T13:16:27.540 回答