将 SPARQL 查询限制为一个数据集

Mat*_*ins 3 sparql

我正在使用以下 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
Run Code Online (Sandbox Code Playgroud)

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

我怀疑该示例可能早于设施和设备数据集的添加,但即使我对 SPARQL 进行了研究,我也无法找到明确的方法来定义要包含哪些数据集。

任何人都可以推荐一个起点,将其限制为仅显示“建筑物”,或者更具体地说,显示“建筑物和地点”数据集的结果。

谢谢

Chr*_*dge 5

首先,您确实需要使用 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
Run Code Online (Sandbox Code Playgroud)

在这里尝试一下: http: //is.gd/WdRAGX

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

要仅根据“位置”图查找站点“内”的内容,请使用: SELECT DISTINCT ?building_number ?name ?ocupants WHERE { ?site a org:Site ; rdfs:标签“海菲尔德校区”。

  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
Run Code Online (Sandbox Code Playgroud)

替代解决方案:


使用 rdf:type

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

除了按图形进行过滤(这不是很“语义”)之外,您还可以将“建筑物”限制为“建筑物”类,而研究设施则不属于“建筑物”类。它们有时仍被列为站点“内部”。通常,大学只公布他们所在的校园,而不公布哪栋大楼。

?building a rooms:Building 
Run Code Online (Sandbox Code Playgroud)

使用过滤器

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

FILTER regex(str(?building), "^http://id.southampton.ac.uk/building/")  
Run Code Online (Sandbox Code Playgroud)

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


腰带和背带

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