Sparql credentials

Onderstaande testquery doet het prima via //api.labs.kadaster, maar werkt niet via brt.basisregstraties. Ik zal vast iets eenvoudigs verkeerd doen, maar ik kom er in ieder geval niet uit…

Alle hulp is welkom.

Groet Jan

sparql = SPARQLWrapper(‘https://brt.basisregistraties.overheid.nl/sparql’)#werktniet
sparql = SPARQLWrapper(‘https://api.labs.kadaster.nl/datasets/kadaster/brt/services/brt/sparql’)#werktwel

sparql.setQuery("""
PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
PREFIX brt: http://brt.basisregistraties.overheid.nl/def/top10nl#
PREFIX geo: http://www.opengis.net/ont/geosparql#
SELECT ?geo (?x as ?geoLabel) WHERE {
?x a brt:Fort;
geo:hasGeometry/geo:asWKT ?geo.
}
“”")
sparql.setReturnFormat(JSON)

sparqljson = sparql.query().convert()
results = sparqljson[‘results’][‘bindings’]
results

Werkt hier zonder problemen.

Misschien kan je beschrijven wat je nu krijgt, en wat je verwacht te krijgen?

Ik poog met sparqlwrapper data uit het endpoint te krijgen. De forten zijn niet meer dan een willekeurig voorbeeld.
Als ik de query doe bij labs krijg ik gewoon een response waar ik de data uit kan halen:

[{‘geo’: {‘type’: ‘typed-literal’,
‘datatype’: ‘http://www.openlinksw.com/schemas/virtrdf#Geometry’,
‘value’: ‘POLYGON((4.677929319 52.391101502,4.677983871 52.391880847,4.67809529 52.391877928,4.678101913 52.391972654,4.677988157 52.391975631,4.677886303 52.39209046,4.677802165 52.392067676,4.677837082 52.39197887,4.677805795 52.391531431,4.677543615 52.39153829,4.677551073 52.391645038,4.677402133 52.391648936,4.677383486 52.391382174,4.677520389 52.39137859,4.677527383 52.391478514,4.677784846 52.39147177,4.677752131 52.391004406,4.677712552 52.391005445,4.677708892 52.390953239,4.677826772 52.390878799,4.677855568 52.391012665,4.677902745 52.391011429,4.678005961 52.391008721,4.678011991 52.391094654,4.678012313 52.391099321,4.677929319 52.391101502))’},
‘geoLabel’: {‘type’: ‘uri’,
‘value’: ‘http://brt.basisregistraties.overheid.nl/top10nl/id/gebouw/102557810’}},
{‘geo’: {‘type’: ‘typed-literal’,

Als ik exact dezelfde query doe naar het endpoint van brt.basisregistraties krijg ik een authenticatieprobleem:

Response:
b’{\r\n “error”:“Kadaster - Niet geauthenticeerd.”,\r\n “error_description”:"Toegang tot de dienst onbekende dienst is alleen voor geauthenticeerde gebruikers.

"\r\n}’

Ik verwacht twee keer hetzelfde te krijgen? Of is er een authenticatie nodig voor de brt endpoint?

Er is geen authenticatie nodig. Worden helaas wat onverwachte fouten gegooid als je een request doet dat niet geaccepteerd wordt.

Een request dat werkt is het volgende:

URL: https://brt.basisregistraties.overheid.nl/sparql
Raw body:

query=PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX brt: <http://brt.basisregistraties.overheid.nl/def/top10nl#>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
SELECT  ?geo (?x as ?geoLabel) WHERE {
	?x a brt:Bunker;
	geo:hasGeometry/geo:asWKT ?geo.
}

Content-Type: application/x-www-form-urlencoded

Of als curl:
curl https://brt.basisregistraties.overheid.nl/sparql --data query=PREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0APREFIX%20brt%3A%20%3Chttp%3A%2F%2Fbrt.basisregistraties.overheid.nl%2Fdef%2Ftop10nl%23%3E%0APREFIX%20geo%3A%20%3Chttp%3A%2F%2Fwww.opengis.net%2Font%2Fgeosparql%23%3E%0ASELECT%20%20%3Fgeo%20%28%3Fx%20as%20%3FgeoLabel%29%20WHERE%20%7B%0A%09%3Fx%20a%20brt%3ABunker%3B%0A%09geo%3AhasGeometry%2Fgeo%3AasWKT%20%3Fgeo.%0A%7D -X POST

Beste Robin,

Nog dank voor je antwoord. Dit is bij mij allemaal een tijd blijven liggen en ik pak het nu weer op.

Ik blijf problemen hebben met onderstaande query. Als ik de query die bij api.labs krijg ik gewoon data terug. Dus er moet in ieder geval iets goed gaan.
Als is exact dezelfde query doe bij basisregistratie.overheid werkt het niet.

Wat voor simpel dom ding ben ik aan het missen??

headers={
‘X-api-key’:X_API_KEY,
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Accept’: ‘application/sparql-results+json’
}

sparql = SPARQLWrapper(‘https://brt.basisregistraties.overheid.nl/sparql’)#werktniet
sparql = SPARQLWrapper(‘https://api.labs.kadaster.nl/datasets/kadaster/brt/services/brt/sparql’)#werktwel

sparql.setQuery("""
PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
PREFIX brt: http://brt.basisregistraties.overheid.nl/def/top10nl#
PREFIX geo: http://www.opengis.net/ont/geosparql#
SELECT ?geo (?x as ?geoLabel) WHERE {
?x a brt:Fort;
geo:hasGeometry/geo:asWKT ?geo.
}
“”")
sparql.setReturnFormat(JSON)

sparqljson = sparql.query().convert()
results = sparqljson[‘results’][‘bindings’]
results

Ik heb helaas geen kennis van de SPARQLWrapper die je gebruikt. Kan je misschien een compleet stukje code delen waarmee het probleem reproduceerbaar is?

Wat je wil is het onderstaande (dat werkt in Postman) omzetten naar je code:


Robin,

Ik kom er nog steeds niet uit. De query is het probleem niet. Volgens mij doe ik iets niet goed met de headers. Ik kan nergens vinden wat er moet worden meegestuurd.
NB!! het labs endpoint werkt zonder headers met dezelfde query…

Zou je nog een tip kunnen geven…

Ik zie nu pas dat je hebt gereageerd. Ik zal even kijken…

Ik heb het zelf maar eens in postman gegooid.
Dat werkt prima.
Daarna gewoon python request gemaakt, werkt ook.

Dat hele SARQLwrapper om onduidelijke redenen niet.
Ik heb nu een werkende request dus die andere bibliotheek ga ik maar vergeten.

Dank, je hebt me via postman wel op weg geholpen om het werkend te krijgen.

Blijft heel vreemd dat sparqlwrapper wel werkt op labs en niet op basisregistratie endpoint. Er lijkt ergens iets mis te gaan met credentials, maar dat zou dan te maken moeten hebben met iets dat sparqlwrapper standaard meestuurt.

Overigens, wat misschien nog interessant voor je is om te weten.
Bij de oude endpoints werkten mijn queries met SPARQWrapper ook. Er is dus kennelijk iets veranderd waardoor ze in de nieuwe worden geweigerd…

De oude endpoints zijn ook totaal niet te vergelijken met de huidige endpoints. Zit een heel ander backend en database achter.

Wat mij nog opviel in de SPARQLWrapper code:

method: The invocation method (HTTP verb).  The **default** value is :data:`GET`, but it can be set to :data:`POST`.

Op de huidige endpoints moet je een POST doen. Dat is dus niet de default van de SPARQLWrapper.

Als je POST als method zet, kom je uit in het volgende stukje SPARQLWrapper code:

            if self.method == POST:
                if self.requestMethod == POSTDIRECTLY:
                    request = urllib.request.Request(uri + "?" + self._getRequestEncodedParameters())
                    request.add_header("Content-Type", "application/sparql-query")
                    request.data = self.queryString.encode('UTF-8')
                else:  # URL-encoded
                    request = urllib.request.Request(uri)
                    request.add_header("Content-Type", "application/x-www-form-urlencoded")
                    request.data = self._getRequestEncodedParameters(("query", self.queryString)).encode('ascii')

waarvan ik zou zeggen dat het precies doet wat je zou willen.

1 like

En dat is het dus precies!
Ik heb daar nier naar gekeken omdat het bij het andere endpoint niet nodig is de method expliciet op POST te zetten.
Tsjongejonge… Voor de volgende SPARQLWrappergebruiker:

from SPARQLWrapper import SPARQLWrapper, JSON, POST
query = “”"
PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
PREFIX brt: http://brt.basisregistraties.overheid.nl/def/top10nl#
PREFIX geo: http://www.opengis.net/ont/geosparql#
SELECT ?geo (?x as ?geoLabel) WHERE {
?x a brt:Bunker;
geo:hasGeometry/geo:asWKT ?geo.
}"""
sparql = SPARQLWrapper(‘https://brt.basisregistraties.overheid.nl/sparql’)
sparql.setQuery(query)
sparql.setMethod(POST)
sparql.setReturnFormat(JSON)
jsonresponse = sparql.query().convert()

Waarbij setMethod(POST) de missing link was

1 like

Dit topic is 180 dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan.