首先,你真的需要使用 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/latest和http://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 确实是建筑物将是我推荐的解决方案。