QuerySparql

Aus JACK Wiki
Zur Navigation springen Zur Suche springen

Zugehörige Evaluatoren

  • MathEvaluator

Beschreibung

Die Funktion querySparql führt eine SPARQL-Anfrage gegen einen gegebenen Service Endpoint durch. Die Funktion erwartet zwei Strings und gibt je nach Ergebnis der Anfrage einen String oder eine Liste zurück.

Syntax

querySparql(Zeichenkette endpoint, Zeichenkette query)

Parameter

  • endpoint - Zeichenkette für den zu verwendenden Service Endpoint. Dieser muss mit "http://" oder "https://" angesprochen werden. Beispiel: "https://query.wikidata.org/sparql"
  • query - Zeichenkette für die Query. Diese muss in gültiger SPARQL-Syntax vorliegen. XML-Entities müssen escaped werden!

Return Value

  • Enthält die SELECT-Klausel der Abfrage genau einen Key und die Abfrage ergibt nur einen Treffer, gibt die Methode eine Zeichenkette zurück.
  • Enthält die SELECT-Klausel der Abfrage mehrere Keys und die Abfrage ergibt nur einen Treffer, gibt die Methode eine Liste von Zeichenketten zurück, in der jeder Eintrag für einen des Keys steht.
  • Enthält die SELECT-Klausel der Abfrage genau einen Key und die Abfrage ergibt mehrere Treffer, gibt die Methode eine Liste von Zeichenketten zurück, in der jeder Eintrag für einen der Treffer steht.
  • Enthält die SELECT-Klausel der Abfrage mehrere Keys und die Abfrage ergibt mehrere Treffer, gibt die Methode eine Liste von Listen von Zeichenketten zurück. Jeder Eintrag der äußeren Liste steht dann für einen Treffer und jeder Eintrag der inneren Liste für einen der Keys.

Beispiele

Eine einfache Anfrage an Wikidata

querySparql(
 'https://query.wikidata.org/sparql',
 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
  PREFIX wdt: <http://www.wikidata.org/prop/direct/>
  PREFIX wikibase: <http://wikiba.se/ontology#>
  PREFIX wd: <http://www.wikidata.org/entity/>
  PREFIX bd: <http://www.bigdata.com/rdf#>
  SELECT DISTINCT ?cityLabel ?provLabel ?prov ?city
  WHERE {{?city wdt:P31 wd:Q515.} UNION {?city wdt:P31 wd:Q839954.} ?city wdt:P131 ?prov. ?prov wdt:P31 wd:Q182547. ?prov rdfs:label ?provL. ?city rdfs:label ?cityL.
  FILTER (langMatches( lang(?provL), "de" ) )
  FILTER (langMatches( lang(?cityL), "de" ) )
  SERVICE wikibase:label { bd:serviceParam wikibase:language "de". }}'
)

Eine Abfrage an Sophox (OSM-SPARQL-Endpoint), die zwei vorher bestimmte Variablen berücksichtigt

querySparql(
 'https://sophox.org/sparql?output=xml',
 concat(
  'PREFIX osmm: <https://www.openstreetmap.org/meta/>
   PREFIX osmt: <https://wiki.openstreetmap.org/wiki/Key:>
   PREFIX wikibase: <http://wikiba.se/ontology#>
   PREFIX geo: <http://www.opengis.net/ont/geosparql#>
   PREFIX bd: <http://www.bigdata.com/rdf#>
   SELECT DISTINCT ?name ?street ?number ?city
   WHERE {
    VALUES ?amenity { "kindergarten" "school" "social_facility" "place_of_worship" "hospital" "fire_station" }
    ?osmid osmt:amenity ?amenity .
    ?osmid osmt:name ?name .
    ?osmid osmt:addr:street ?street .
    ?osmid osmt:addr:housenumber ?number .
    ?osmid osmt:addr:city ?city .
    SERVICE wikibase:around { 
     ?osmid osmm:loc ?loc . 
     bd:serviceParam wikibase:center "Point(', [var=lat], ' ', [var=lon], ')"^^geo:wktLiteral . 
     bd:serviceParam wikibase:radius "0.8" . 
    } 
   }'
 )
)

JUnit Tests

[Anzeigen]

	@Test
	public void testQuerySparqlTupleList() throws OpenMathException, EvaluatorException {
		OMOBJ omobj = ExpressionParser.parse("querySparql('https://query.wikidata.org/sparql', 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX wd: <http://www.wikidata.org/entity/> PREFIX bd: <http://www.bigdata.com/rdf#> SELECT DISTINCT ?cityLabel ?prov ?city WHERE {{?city wdt:P31 wd:Q515.} UNION {?city wdt:P31 wd:Q839954.} ?city wdt:P131 ?prov. ?prov wdt:P31 wd:Q182547. ?prov rdfs:label ?provL. ?city rdfs:label ?cityL. FILTER (langMatches( lang(?provL), \"de\" ) ) FILTER (langMatches( lang(?cityL), \"de\" ) ) SERVICE wikibase:label { bd:serviceParam wikibase:language \"de\". }}')", null, null);
		Object result = OMToResultVisitor.getInstance().visit(omobj);
		assertEquals(true, OMTypeChecker.isOMAWithSymbol(result,OMSymbol.LIST1_LIST));
		OMA resultList = (OMA)result;
		for (Object o : new ArrayList<>(resultList.getOmel().subList(1, resultList.getOmel().size()))) {
			assertEquals(true, OMTypeChecker.isOMAWithSymbol(o, OMSymbol.LIST1_LIST));
		}
	}
	
	@Test
	public void testQuerySparqlSingleTuple() throws OpenMathException, EvaluatorException {
		OMOBJ omobj = ExpressionParser.parse("querySparql('https://query.wikidata.org/sparql', 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX wd: <http://www.wikidata.org/entity/> PREFIX bd: <http://www.bigdata.com/rdf#> SELECT DISTINCT ?cityLabel ?prov ?city WHERE {{?city wdt:P31 wd:Q515.} UNION {?city wdt:P31 wd:Q839954.} ?city wdt:P131 ?prov. ?prov wdt:P31 wd:Q182547. ?prov rdfs:label ?provL. ?city rdfs:label ?cityL. FILTER (langMatches( lang(?provL), \"de\" ) ) FILTER (langMatches( lang(?cityL), \"de\" ) ) SERVICE wikibase:label { bd:serviceParam wikibase:language \"de\". }} LIMIT 1')", null, null);
		Object result = OMToResultVisitor.getInstance().visit(omobj);
		assertEquals(true, OMTypeChecker.isOMAWithSymbol(result, OMSymbol.LIST1_LIST));
	}
	
	@Test
	public void testQuerySparqlStringList() throws OpenMathException, EvaluatorException {
		OMOBJ omobj = ExpressionParser.parse("querySparql('https://query.wikidata.org/sparql', 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX wd: <http://www.wikidata.org/entity/> PREFIX bd: <http://www.bigdata.com/rdf#> SELECT ?cityLabel WHERE {{?city wdt:P31 wd:Q515.} UNION {?city wdt:P31 wd:Q839954.} ?city wdt:P131 ?prov. ?prov wdt:P31 wd:Q182547. ?prov rdfs:label ?provL. ?city rdfs:label ?cityL. FILTER (langMatches( lang(?provL), \"de\" ) ) FILTER (langMatches( lang(?cityL), \"de\" ) ) SERVICE wikibase:label { bd:serviceParam wikibase:language \"de\". }}')", null, null);
		Object result = OMToResultVisitor.getInstance().visit(omobj);
		assertEquals(true, OMTypeChecker.isOMAWithSymbol(result, OMSymbol.LIST1_LIST));
		OMA resultList = (OMA)result;
		for (Object o : new ArrayList<>(resultList.getOmel().subList(1, resultList.getOmel().size()))) {
			assertEquals(true, OMTypeChecker.isOMSTR(o));
		}
	}
	
	@Test
	public void testQuerySparqlSingleString() throws OpenMathException, EvaluatorException {
		OMOBJ omobj = ExpressionParser.parse("querySparql('https://query.wikidata.org/sparql', 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX wd: <http://www.wikidata.org/entity/> PREFIX bd: <http://www.bigdata.com/rdf#> SELECT ?cityLabel WHERE {{?city wdt:P31 wd:Q515.} UNION {?city wdt:P31 wd:Q839954.} ?city wdt:P131 ?prov. ?prov wdt:P31 wd:Q182547. ?prov rdfs:label ?provL. ?city rdfs:label ?cityL. FILTER (langMatches( lang(?provL), \"de\" ) ) FILTER (langMatches( lang(?cityL), \"de\" ) ) SERVICE wikibase:label { bd:serviceParam wikibase:language \"de\". }} LIMIT 1')", null, null);
		Object result = OMToResultVisitor.getInstance().visit(omobj);
		assertEquals(true, OMTypeChecker.isOMSTR(result));
	}
	
	@Test(expected = FunctionInvalidNumberOfArgumentsException.class)
	public void testDeterminantWithZeroParam() throws OpenMathException, EvaluatorException {
		OMOBJ omobj = ExpressionParser.parse("querySparql()", null, null);
		OMToResultVisitor.getInstance().visit(omobj);
		fail();
	}

	@Test(expected = FunctionInvalidArgumentTypeException.class)
	public void testDeterminantWithWrongArguments() throws OpenMathException, EvaluatorException {
		OMOBJ omobj = ExpressionParser.parse("querySparql(1,2)", null, null);
		OMToResultVisitor.getInstance().visit(omobj);
		fail();
	}

Hinweise

Bei Abfragen mit Zufallsbestandteilen kann es passieren, dass statt einer erwarteten Menge von mehreren Treffern mit mehreren Spalten (die zu einer Liste von Listen als Rückgabe führen) nur ein Treffer mit mehreren Spalten zurückgegeben wird (der als einfache Liste in der Rückgabe erscheint). Um die Rückgabe zu prüfen, kann isSet verwendet werden, um für ein beliebiges Element der Rückgabeliste zu prüfen, ob es sich selber wiederum um eine Liste handelt. Falls nicht, kann man die Rückgabe selber in eine zusätzliche Liste verpacken, um die nachfolgende Behandlung für alle Fälle identisch zu gestalten:

<option name="allTuples" value="querySparql(...)" />
<option name="testTuple" value="getRandomFromList([var=allTuples])" />
<option name="tuples" value="ifthenelse(isSet([var=testTuple]),[var=allTuples],list([var=allTuples]))" />
... weitere Operationen auf [var=tuples] ...