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

时间:2013-03-09 16:28:55

标签: sparql

我正在使用以下SPARQL查询,这是my institution's SPARQL endpoint基于网络的一端的示例;

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进行了研究,我也看不到一种明确的方法来定义要包含的数据集。

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

由于

1 个答案:

答案 0 :(得分: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:标签“Highfield Campus”。

  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:输入

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

而不是按图形过滤,这不是非常“语义”,你也可以将建筑限制为“建筑”类,研究设施不是。它们有时仍被列为“在网站内”。通常当大学只发布他们所在的校园而不是哪个校区时。

?building a rooms:Building 

使用FILTER

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

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

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


腰带和大括号

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