SPARQL 查询比预期多 returns 行
SPARQL query returns more rows than expected
我正在尝试将以下 Turtle RDF 转换为 csv。我只想为每个对象保留 hasPlaceName
、hasICAOcode
和 hasWKT
的值:
:Place_Oberschleissheim_Airport a :Civil_Aerodrome
; :hasPlaceName "OBERSCHLEISSHEIM"
; :hasICAOcode "EDNX"
; :elevationOfPlace "487.68"^^unit:meters
; :hasGeometry :geom_11_55916690826416_48_239166259765625
; :Aerodrome_serves_City :City_OBERSCHLEISSHEIM
. :City_OBERSCHLEISSHEIM a :City
. :geom_11_55916690826416_48_239166259765625 a :Geometry
; :hasWKT "POINT (11.55916690826416 48.239166259765625)" .
:Place_Oberschleissheim_Airport a :Civil_Aerodrome
; :hasPlaceName "OBERSCHLEISSHEIM"
; :hasICAOcode "EDMX"
; :elevationOfPlace "487.68"^^unit:meters
; :hasGeometry :geom_11_565555572509766_48_23805618286133
; :Aerodrome_serves_City :City_OBERSCHLEISSHEIM
. :City_OBERSCHLEISSHEIM a :City
. :geom_11_565555572509766_48_23805618286133 a :Geometry
; :hasWKT "POINT (11.565555572509766 48.23805618286133)" .
这是我的 SPARQL 查询:
SELECT DISTINCT ?icao ?name ?wkt
WHERE {
[] a :Civil_Aerodrome ;
:hasPlaceName ?name ;
:hasICAOcode ?icao ;
:hasGeometry/:hasWKT ?wkt .
}
但是我得到了四条记录,而不是两条:
(u'EDNX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.565555572509766 48.23805618286133)')
(u'EDMX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.565555572509766 48.23805618286133)')
(u'EDNX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.55916690826416 48.239166259765625)')
(u'EDMX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.55916690826416 48.239166259765625)')
我想我在 SPARQL 语法中遗漏了一些东西。任何指向正确方向的线索将不胜感激。
您的 SPARQL 查询是正确的,结果也是如此。问题出在你的数据上。
您已经定义了一个机场资源,:Place_Oberschleissheim_Airport
。但是,您为这个单一机场提供了两个不同的 icao 代码和两组不同的坐标。
然后您提出一个查询,该查询要求任何机场的 icao、地名和坐标集的所有不同组合。只有一个机场,但它有两个 icaos 和两个坐标集,因此您的查询有四个独特的结果:
icao code 1, coordinate 1
icao code 2, coordinate 1
icao code 1, coordinate 2
icao code 2, coordinate 2
解决方案是确保您的数据对不同的机场使用不同的标识符(或者更一般地说,确保每个机场的坐标和 icao 代码是唯一的)。
或者,如果数据确实必须保持这种状态,并且您希望查询 return 每个机场的唯一结果,您将不得不问自己应该使用哪个坐标和哪个 icao 代码 return.
如果答案是"just pick one of each, I don't care which",您可以进行以下操作
SELECT DISTINCT (SAMPLE(?icao) as ?code) ?name (sample(?wkt) as ?coord)
WHERE {
?airport a :Civil_Aerodrome ;
:hasPlaceName ?name ;
:hasICAOcode ?icao ;
:hasGeometry/:hasWKT ?wkt .
} group by ?airport ?name
结果:
Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| code | name | coord |
+------------------------+------------------------+------------------------+
| "EDNX" | "OBERSCHLEISSHEIM" | "POINT (11.55916690826416 48.239166259765625)"|
+------------------------+------------------------+------------------------+
1 result(s) (13 ms)
如果另一方面你想要两者都回来,你要么必须接受你得到更多行,要么你可以将备选方案放在一行中:
SELECT DISTINCT (GROUP_CONCAT(DISTINCT ?icao) as ?codes) ?name (GROUP_CONCAT(DISTINCT ?wkt) as ?coords)
WHERE {
?airport a :Civil_Aerodrome ;
:hasPlaceName ?name ;
:hasICAOcode ?icao ;
:hasGeometry/:hasWKT ?wkt .
} group by ?airport ?name
结果:
Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| codes | name | coords |
+------------------------+------------------------+------------------------+
| "EDNX EDMX" | "OBERSCHLEISSHEIM" | "POINT (11.55916690826416 48.239166259765625) POINT (11.565555572509766 48.23805618286133)"|
+------------------------+------------------------+------------------------+
1 result(s) (2 ms)
我正在尝试将以下 Turtle RDF 转换为 csv。我只想为每个对象保留 hasPlaceName
、hasICAOcode
和 hasWKT
的值:
:Place_Oberschleissheim_Airport a :Civil_Aerodrome
; :hasPlaceName "OBERSCHLEISSHEIM"
; :hasICAOcode "EDNX"
; :elevationOfPlace "487.68"^^unit:meters
; :hasGeometry :geom_11_55916690826416_48_239166259765625
; :Aerodrome_serves_City :City_OBERSCHLEISSHEIM
. :City_OBERSCHLEISSHEIM a :City
. :geom_11_55916690826416_48_239166259765625 a :Geometry
; :hasWKT "POINT (11.55916690826416 48.239166259765625)" .
:Place_Oberschleissheim_Airport a :Civil_Aerodrome
; :hasPlaceName "OBERSCHLEISSHEIM"
; :hasICAOcode "EDMX"
; :elevationOfPlace "487.68"^^unit:meters
; :hasGeometry :geom_11_565555572509766_48_23805618286133
; :Aerodrome_serves_City :City_OBERSCHLEISSHEIM
. :City_OBERSCHLEISSHEIM a :City
. :geom_11_565555572509766_48_23805618286133 a :Geometry
; :hasWKT "POINT (11.565555572509766 48.23805618286133)" .
这是我的 SPARQL 查询:
SELECT DISTINCT ?icao ?name ?wkt
WHERE {
[] a :Civil_Aerodrome ;
:hasPlaceName ?name ;
:hasICAOcode ?icao ;
:hasGeometry/:hasWKT ?wkt .
}
但是我得到了四条记录,而不是两条:
(u'EDNX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.565555572509766 48.23805618286133)')
(u'EDMX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.565555572509766 48.23805618286133)')
(u'EDNX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.55916690826416 48.239166259765625)')
(u'EDMX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.55916690826416 48.239166259765625)')
我想我在 SPARQL 语法中遗漏了一些东西。任何指向正确方向的线索将不胜感激。
您的 SPARQL 查询是正确的,结果也是如此。问题出在你的数据上。
您已经定义了一个机场资源,:Place_Oberschleissheim_Airport
。但是,您为这个单一机场提供了两个不同的 icao 代码和两组不同的坐标。
然后您提出一个查询,该查询要求任何机场的 icao、地名和坐标集的所有不同组合。只有一个机场,但它有两个 icaos 和两个坐标集,因此您的查询有四个独特的结果:
icao code 1, coordinate 1
icao code 2, coordinate 1
icao code 1, coordinate 2
icao code 2, coordinate 2
解决方案是确保您的数据对不同的机场使用不同的标识符(或者更一般地说,确保每个机场的坐标和 icao 代码是唯一的)。
或者,如果数据确实必须保持这种状态,并且您希望查询 return 每个机场的唯一结果,您将不得不问自己应该使用哪个坐标和哪个 icao 代码 return.
如果答案是"just pick one of each, I don't care which",您可以进行以下操作
SELECT DISTINCT (SAMPLE(?icao) as ?code) ?name (sample(?wkt) as ?coord)
WHERE {
?airport a :Civil_Aerodrome ;
:hasPlaceName ?name ;
:hasICAOcode ?icao ;
:hasGeometry/:hasWKT ?wkt .
} group by ?airport ?name
结果:
Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| code | name | coord |
+------------------------+------------------------+------------------------+
| "EDNX" | "OBERSCHLEISSHEIM" | "POINT (11.55916690826416 48.239166259765625)"|
+------------------------+------------------------+------------------------+
1 result(s) (13 ms)
如果另一方面你想要两者都回来,你要么必须接受你得到更多行,要么你可以将备选方案放在一行中:
SELECT DISTINCT (GROUP_CONCAT(DISTINCT ?icao) as ?codes) ?name (GROUP_CONCAT(DISTINCT ?wkt) as ?coords)
WHERE {
?airport a :Civil_Aerodrome ;
:hasPlaceName ?name ;
:hasICAOcode ?icao ;
:hasGeometry/:hasWKT ?wkt .
} group by ?airport ?name
结果:
Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| codes | name | coords |
+------------------------+------------------------+------------------------+
| "EDNX EDMX" | "OBERSCHLEISSHEIM" | "POINT (11.55916690826416 48.239166259765625) POINT (11.565555572509766 48.23805618286133)"|
+------------------------+------------------------+------------------------+
1 result(s) (2 ms)