User:Molarus/SPARQL-Endpoint-01.js

From Wikidata
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
$(document).ready(function(){
var feature = (function() {
test = function() {
var d = "<div id='toptool' style='padding:3px;border:thin solid black;position:absolute;right:0px;top:15px;background-color:#ffe1bc'>SPARQL- und Infobox-Abfragetool V0.7<br/>" ;
    d += "<tr id='description-d1'>";
    d += "<input type='button' value='load SPARQL' id='button-SPARQL'>";
    d += "<input type='button' value='load top WPdata' id='button-WPdata'>";
    d += "<input type='button' value='compute' id='button-WPcompute'>";    
    d += "<input type='button' value='next WPdata' id='button-next-WPdata'>";
    d += "<input type='button' value='info' id='button-info'></br>";
    d += "Parameter: <input type='text' size='8' id='infobox_parameter_1' value='HÖHE'>";
    d += "  <select id='menu'><option selected value='datatype_quantity'>quantity</option><option value='datatype_item'>item</option></select>";
    d += " Parameter (qual): <input type='text' size='10' id='infobox_parameter_2' value='HÖHE-BEZUG'>";
    d += " Parameter (ref): <input type='text' size='15' id='infobox_parameter_nachweis' value='NACHWEIS-FLÄCHE'>";
    d +="<p id='infobox_form'></p>";    
    d += "<tr><p align='center'><textarea id='message' cols='80' rows='5' lang='en'>begin with clicking the button 'load SPARQL'";
    d += "</textarea>";
    d +="<p id='weblink'></p>";
    d += "</tr></div>" ;
    $('#mw-content-text').append ( d ) ;

var WDproperty_statm = 'P2044'; // P64, Höhe über dem Meeresspiegel=P2044 
var WDvalue_statm;
var WDvalue_statm_x = '+'; // '+' oder '-'
var WDvalue_statm_unit = 'Q11573'; // Q15, Meter=Q11573, Kilometer=Q828224, Hektar=Q35852, Quadratkilometer=Q712226, Kubikkilometer=Q4243638  
var WDqualiproperty = 'P459'; // P48, Bestimmungsmethode=P459 
var WDqualivalue = 'unknown'; // DE-NHN = 1398875 (Normalhöhennull), DE-NN, DE-HN, AT, CH 
var WDrefproperty1 = 'P143'; // P143, importiert aus 
var WDrefvalue1 = '48183'; // Q48183=deWP
var WDrefproperty2 = 'P1476'; // P48, Titel=P1476 
var WDrefvalue2 = 'test ref 1';
var WDrefproperty3 = 'P854'; // P31, URL=P854 
var WDrefvalue3 = 'https://www.wikidata.org';
var WDrefproperty4 = 'P813'; // P813= abgerufen am 
var WDrefvalue4 = '+2020-01-01T00:00:00Z';

$('#button-WPcompute').click(function () { // 'button-WPcompute' geklickt 
  var el = document.getElementById('weblink'); 
  var WDitem = el.firstChild.toString(); 
  WDitem = 'Q'+WDitem.match(/\d+/);
  console.log('WDqualivalue= '+WDqualivalue);
  var quantity =  " item = <input type='text' size='10' id='infobox_item' value='"+WDitem+"'></br>"; // 'Q1421'
      quantity += " property (statm) = <input type='text' size='7' id='infobox_property' value='"+WDproperty_statm+"'>";
      quantity += " value (statm): amount = <input type='text' size='10' id='infobox_amount' value='"+WDvalue_statm_x+WDvalue_statm+"'>"; //WDvalue '+395.23'
      quantity += " unit = <input type='text' size='10' id='infobox_unit' value='"+WDvalue_statm_unit+"'>";
      quantity += " <input type='button' value='OK' id='statement_OK'></br>";
      quantity += " property (quali) = <input type='text' size='7' id='quali_property' value='"+WDqualiproperty+"'>";
      quantity += " value (quali) = <input type='text' size='21' id='quali_value' value='"+WDqualivalue+"'>";  
      quantity += " <input type='button' value='OK' id='qualifier_OK'></br>";
      quantity += " property (ref)   = <input type='text' size='7' id='ref_property_1' value='"+WDrefproperty1+"'>";
      quantity += " value (ref) = <input type='text' size='25' id='ref_value_1' value='"+WDrefvalue1+"'>"; 
      quantity += " <input type='button' value='OK' id='references_1_OK'></br>";
      quantity += " property (ref)   = <input type='text' size='7' id='ref_property_2' value='"+WDrefproperty2+"'>";
      quantity += " value (ref)  = <input type='text' size='25' id='ref_value_2' value='"+WDrefvalue2+"'>";
      quantity += " <input type='button' value='OK' id='references_2_OK'></br>";
      quantity += " property (ref)   = <input type='text' size='7' id='ref_property_3' value='"+WDrefproperty3+"'>";
      quantity += " value (ref) = <input type='text' size='25' id='ref_value_3' value='"+WDrefvalue3+"'>"; 
      quantity += " <input type='button' value='OK' id='references_3_OK'></br>";
      quantity += " property (ref)   = <input type='text' size='7' id='ref_property_4' value='"+WDrefproperty4+"'>";
      quantity += " value (ref) = <input type='text' size='25' id='ref_value_4' value='"+WDrefvalue4+"'>"; 
      quantity += " <input type='button' value='OK' id='references_4_OK'>";
      quantity += " <input type='button' value='ref OK' id='references_all_OK'></br>";
      quantity += " ref: <input type='text' size='70' id='var' value='{'>"; 
      
  var item  = "Parameter testWD: item = <input type='text' size='10' id='infobox_item' value='"+WDitem+"'></br>"; 
      item += "Reference: property 1 = <input type='text' size='10' id='ref_property_1' value='"+WDrefproperty1+"'>";
      item += "value = <input type='text' size='10' id='ref_value_1' value='test ref 1'></br>";
      item += "Reference: property 2 = <input type='text' size='10' id='ref_property_2' value='"+WDrefproperty2+"'>";
      item += "value = <input type='text' size='10' id='ref_value_2' value='test ref 2'>";  
      
  //console.log(document.getElementById('menu').value);
  if (document.getElementById('menu').value == 'datatype_quantity') {
      $('#infobox_form').empty();
      $('#infobox_form').append(quantity);
  }
  if (document.getElementById('menu').value == 'datatype_item') {
      $('#infobox_form').empty();
      $('#infobox_form').append(item);
  } 
  $('#references_1_OK').click(function () { // 'references_1_OK' geklickt
    var string = '"'+document.getElementById("ref_property_1").value+'":[{"snaktype":"value","property":"';
    string += document.getElementById("ref_property_1").value+'","datavalue":{"type":"wikibase-entityid","value":';
    string += '{"entity-type":"item","numeric-id":'+document.getElementById("ref_value_1").value+'}}}]';  
	document.getElementById("var").value = document.getElementById("var").value + string;
	$("#references_1_OK").css("background-color", "#FFFF00"); $("#references_1_OK").val('set');
  }); 

  $('#references_2_OK').click(function () { // 'references_2_OK' geklickt, monolingualtext
    var string = ',"'+document.getElementById("ref_property_2").value + '":[{"snaktype":"value","property":"';
    string += document.getElementById("ref_property_2").value+'","datavalue":{"value":{"text":"';
    string += document.getElementById("ref_value_2").value+'","language":"de"},"type":"monolingualtext"},"datatype":"monolingualtext"}]';
	document.getElementById("var").value = document.getElementById("var").value + string;
    $("#references_2_OK").css("background-color", "#FFFF00"); $("#references_2_OK").val('set');
  });

  $('#references_3_OK').click(function () { // 'references_3_OK' geklickt
    var string = ',"'+document.getElementById("ref_property_3").value+'":[{"snaktype":"value","property":"';
    string += document.getElementById("ref_property_3").value+'","datavalue":{"value":"';
    string += document.getElementById("ref_value_3").value+'","type":"string"},"datatype": "url"}]';
    document.getElementById("var").value = document.getElementById("var").value + string;
    $("#references_3_OK").css("background-color", "#FFFF00"); $("#references_3_OK").val('set');
  });
  
  $('#references_4_OK').click(function () { // 'references_3_OK' geklickt
    var string = ',"'+document.getElementById("ref_property_4").value+'":[{"snaktype":"value","property":"';
    string += document.getElementById("ref_property_4").value+'","datavalue":{"value":{"time":"';
    string += document.getElementById("ref_value_4").value+'","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":';
    string += '"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]';
     document.getElementById("var").value = document.getElementById("var").value + string;
    $("#references_4_OK").css("background-color", "#FFFF00"); $("#references_4_OK").val('set');
  });  // "string" - string ist nicht OK
  
  $('#references_all_OK').click(function () { // 'references_4_OK' geklickt
    document.getElementById("var").value = document.getElementById("var").value + '}';
    var string_all = document.getElementById("var").value ;
    console.log(string_all); $('#message').val(string_all); 
    createClaim_ref ( document.getElementById('infobox_item').value, document.getElementById('infobox_property').value, string_all);
    $("#references_all_OK").css("background-color", "#90EE90"); $("#references_all_OK").val('done');
  });  

  $('#statement_OK').click(function () { // 'statement_OK' geklickt
    var string1 = '{"amount":"'+document.getElementById("infobox_amount").value; // property-value pair 
    string1 += '","unit":"http://www.wikidata.org/entity/'+document.getElementById("infobox_unit").value+'",'; 
    string1 += '"upperBound":"'+document.getElementById("infobox_amount").value+'",';
    string1 += '"lowerBound":"'+document.getElementById("infobox_amount").value+'"}';
    tryCreateClaim(document.getElementById('infobox_item').value, document.getElementById('infobox_property').value, string1);  
  }); // funktioniert, 30.11.2015

  $('#qualifier_OK').click(function () { // 'qualifier_OK' geklickt
    var string2 ='{"entity-type":"item","numeric-id":'+document.getElementById("quali_value").value+'}'; //'"'+document.getElementById("quali_value").value+'"'; //qualifier
    createClaim_quali ( document.getElementById('infobox_item').value, document.getElementById('infobox_property').value, string2);
    //console.log('qualifier_OK'); $('#message').val('qualifier_OK'); 
    //$("#qualifier_OK").css("background-color", "#90EE90"); $("#qualifier_OK").val('done');    
  }); // funktioniert, 30.11.2015
}); 

function createClaim_ref( wd_entity , wd_property, ref3){ 
	console.log ( "createClaim_ref " + wd_entity + " / " + wd_property + " / " +  ref3) ;
    //api = '/w/api.php' ;
	$.post ('/w/api.php', { action: 'query', meta: 'tokens', type: 'csrf', titles: wd_entity, format: 'json' }, 
	function ( data ) {
		console.log(data);
		var mytoken = data.query.tokens.csrftoken ;
		if ( undefined === mytoken ) { console.log ( "Cannot get edit token for " + entity ); return; }
		$.post ('/w/api.php', { action: 'wbgetclaims', entity: wd_entity, property: wd_property, format: 'json' }, 
		function ( data ) {
			console.log(data);
			console.log('createClaim_ref '+ data.claims[wd_property][0].id);
 	    	$.post ('/w/api.php', { action: 'wbsetreference', statement: data.claims[wd_property][0].id, snaks: ref3, token: mytoken, format: 'json'}, 
	    	function ( data ) {
			console.log(data);
			if (data.error !== undefined ) { console.log("Fehler-Code: "+data.error.code ); $('#message').val('Can´t create reference: '+data.error.code);}
			if (data.success === 1) {
                  console.log ( "Creating reference 3 ", ref3 ) ;
                  $('#message').val('Creating ' + wd_entity + ' / ' + ref3);
                  $("#statement_OK").css("background-color", "#90EE90"); $("#statement_OK").val('done');
 				  } 	    		
    }, 'json' ) ;		
	}, 'json' ) ;
	}, 'json' ) ;	
} 

$('#button-SPARQL').click(function () { // 'button-SPARQL' geklickt
  //get_testsparql();
  $('#message').val('Loading SPARQL-data. ');
  get_sparql();
  
}); // funktioniert, 20.11.2015

$('#button-WPdata').click(function () { // 'button-WPdata' geklickt
    //get_testWPdata();
    get_WPdata();      
}); // funktioniert, 21.10.2015

$('#button-info').click(function () { 
    newwindow2=window.open('','name','height=200,width=250');
	var tmp = newwindow2.document;
	tmp.write('<html><head><title>infos</title></head>');
	tmp.write('<script></script>');
	tmp.write('<body><ul><li>DE-NHN = Q1398875</li><li>DE-NN = Q268449</li><li>AT = Q23202</li><li>CH = Q694278</li></ul> ');
	tmp.write('</body></html>');
	tmp.close();
  }); // funktioniert 14.12.2015
  
$('#button-next-WPdata').click(function () { // 'button-next-WP' geklickt
  var verschwunden;
  var el = document.getElementById('weblink');
  verschwunden = el.removeChild(el.firstChild);
  verschwunden = el.removeChild(el.firstChild);
  verschwunden = el.removeChild(el.firstChild); 
  verschwunden = el.removeChild(el.firstChild); 
  $('#infobox_form').empty();
  $('#message').val('press button "load top WPdata" until there is no top WPdata left');
}); // funktioniert, 30.11.2015

function tryCreateClaim( wd_entity , wd_property, value ) {
	//console.log ( "tryCreateClaim " + wd_entity + " / " + wd_property + " / " + value) ;
    api = '/w/api.php' ;	
    $.post ( api , { action: 'wbgetclaims', entity: wd_entity, property: wd_property, format: 'json' }, 
	    function ( data ) {
	    console.log(data);
		if ( undefined === data.claims[wd_property] ) {
			//console.log ( wd_property+' not exists for '+ wd_entity ) ;
			createClaim ( wd_entity, wd_property, value); 
		} else {
            console.log ( wd_property+' exists for '+ wd_entity ) ;
        } 
	} ) ;
} 

function createClaim( wd_entity , wd_property , val){ 
	//console.log ( "createClaim " + wd_entity + " / " + wd_property + " / " + val) ;
    api = '/w/api.php' ;
	$.post ( api , { action: 'query', meta: 'tokens', type: 'csrf', titles: wd_entity, format: 'json' }, 
	    function ( data ) {
		//console.log(data);
		var mytoken = data.query.tokens.csrftoken ;
		//console.log (data.query.tokens);
		if ( undefined === mytoken ) { console.log ( "Cannot get edit token for " + entity ); return; }
		$.post ( api , { action: 'wbcreateclaim', entity: wd_entity, snaktype: 'value', property: wd_property,
			             value: val, token: mytoken, format: 'json' }, 
		    function ( data ) {
			console.log(data);
			if (data.error !== undefined ) { console.log("Fehler-Code: "+data.error.code ); $('#message').val('Can´t create claim: '+data.error.code);}
			if (data.success === 1) {
                     console.log ( "Creating " + wd_entity + " / " + wd_property + " / " + val ) ;
                     $('#message').val('Creating ' + wd_entity + ' / ' + wd_property + ' / ' + val);
                     $("#statement_OK").css("background-color", "#90EE90"); $("#statement_OK").val('done');
 				  } 
	}, 'json' ) ;
	}, 'json' ) ;
} 

function createClaim_quali( wd_entity , wd_property, qualifier){ 
	console.log ( "createClaim_quali " + wd_entity + " / " + wd_property +  " / " + qualifier) ;
    api = '/w/api.php' ;
	$.post ( api , {
		action : 'query' ,
		meta : 'tokens' ,
		type : 'csrf' ,
		titles : wd_entity ,
		format : 'json'
	} , function ( data ) {
		console.log(data);
		var mytoken = data.query.tokens.csrftoken ;
		//console.log (data.query.tokens);

		if ( undefined === mytoken ) {
			console.log ( "Cannot get edit token for " + entity ) ;
			return ;
		}

		$.post ( api , {
			action : 'wbgetclaims' ,
			entity : wd_entity ,
			property : wd_property ,
			format : 'json'
		} , function ( data ) {
			//console.log(data);
			//console.log('createClaim_quali '+data.claims[wd_property][0].id);
            //console.log ( "try to creat qualifier ", qualifier ) ;    
	    	$.post ( api , {
    			action : 'wbsetqualifier' ,
	    		claim :  data.claims[wd_property][0].id , 
	    		snaktype : 'value', 		
                property : document.getElementById("quali_property").value,  		
    		    value : qualifier, //für items '{"entity-type":"item","numeric-id":1421}', // für strings '"GdyjxP8I6XB3"',
    			token : mytoken ,
	    		format : 'json'
	    	} , function ( data ) {
		    console.log(data);	    		
			if (data.error !== undefined ) { console.log("Fehler-Code: "+data.error.code ); $('#message').val('Can´t create property: '+data.error.code);}
			if (data.success === 1) {
                     console.log ( "Creating qualifier ", document.getElementById("quali_property").value, " ", qualifier ) ;
                     $('#message').val('Creating qualifier ' + wd_entity + ' / ' + document.getElementById("quali_property").value + ' / ' + qualifier); 
                     $("#qualifier_OK").css("background-color", "#90EE90"); $("#qualifier_OK").val('done');
 				  } 	    		
    }, 'json' ) ;		
	}, 'json' ) ;
	}, 'json' ) ;	
} 

function get_WPdata(){
var output;
var el = document.getElementById('weblink');
console.log(el.childNodes[2].textContent); // find WP-Lemma
console.log('Parameter 1 = ' + infobox_parameter_1.value);
console.log('Parameter 2 = ' + infobox_parameter_2.value);
console.log('Nachweis = ' + infobox_parameter_nachweis.value);	

mw.loader.using( 'mediawiki.ForeignApi' ).done( function () {
    var api = new mw.ForeignApi( 'https://de.wikipedia.org/w/api.php' );
    api.get( {
        action: 'parse',
        format: 'json',
        page: el.childNodes[2].textContent, // 'Bodensee',
        prop: 'wikitext',
        section: 0
    } ).done( function ( data ) {
    //console.log(data);	
    var string0 = data.parse.wikitext['*'];

// für Parameter 1
var re = new RegExp(infobox_parameter_1.value+' ?=.+\n');
var string1 = string0.match(re);   //(/HÖHE = .+\n/);
console.log("string1:", string1);
if (string1 !== null) {
   var pos1 = 1 + string1[0].indexOf('=');
   var res1 = string1[0].slice(pos1); 
   console.log(string1[0], 'value of parameter is: ' +res1);
   output = infobox_parameter_1.value + ' = ' + res1; 
   WDvalue_statm = res1.match(/\d+[.]?\d*/);
   WDvalue_statm_x = res1.match(/[+,-]/); // '+' or '-'
   if (WDvalue_statm_x === null) {WDvalue_statm_x = '+'}
   console.log('>'+WDvalue_statm+'<');
} else {
   console.log('Parameter 1 not found');
   output = 'Parameter 1 not found\n';
}

// für Parameter (qualifier)
re = new RegExp(infobox_parameter_2.value+' ?=.+\n');
string1 = string0.match(re);   //(/HÖHE = .+\n/);
if (string1 !== null) {
   var pos2 = 1 + string1[0].indexOf('=');
   var res2 = string1[0].slice(pos2); 
   console.log(string1[0], 'Value of parameter (qualifier) is: ' +res2);
   output = output + infobox_parameter_2.value + ' =' + res2; 
   var str = res2.match(/CH|AT|DE-NHN|DE-NN/);  // /\w+[-]?\w*/
   WDqualivalue = '1398875'; // Standard
   if (str=='CH') { WDqualivalue = '694278';  } //"Meter über Meer" für CH
   if (str=='AT') { WDqualivalue = '23202' } //"Meter über Adria" für AT
   if (str=='DE-NHN') { WDqualivalue = '1398875' } //"Normalhöhennull" für DE
   if (str=='DE-NN') { WDqualivalue = '268449' } //"Normalnull" für DE
} else {
   console.log('Parameter (qualifier) nicht gefunden');
   output = output + 'Parameter (qualifier) nicht gefunden\n';
}

// für references
re = new RegExp(infobox_parameter_nachweis.value+' ?=.+\n');
var string2 = string0.match(re);   //(/NACHWEIS-HÖHE = .+\n/);
if (string2 !== null) {
   var pos3 = 1 + string2[0].indexOf('=');
   var res3 = string2[0].slice(pos3); 
   console.log(string2[0], 'Value of parameter (ref) is: ' +res3);
   output = output + infobox_parameter_nachweis.value + ' = ' + res3;
} else {
   console.log('Nachweis nicht gefunden');
   output = output +'Nachweis nicht gefunden';
}
    $('#message').val(output);  
    } );
} );	
}

function get_sparql(){
var query = 
        "PREFIX wikibase: <http://wikiba.se/ontology#>" +     
        "PREFIX wd: <http://www.wikidata.org/entity/>" +
        "PREFIX wdt: <http://www.wikidata.org/prop/direct/>" +
        "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" +
        "PREFIX schema: <http://schema.org/>" +

        "SELECT ?p ?pLabel ?p_article WHERE {" +
 		"VALUES ?z1 {wd:Q183 wd:Q40 wd:Q39}" +
 		"?p wdt:P31 wd:Q23397 FILTER NOT EXISTS {?p wdt:P2044 ?x }." +
 		"?p wdt:P17 ?z1." +
 		"SERVICE wikibase:label {bd:serviceParam wikibase:language 'en,de'}" +
 		"OPTIONAL {" +
  		"?p_article schema:about ?p ." +
 		"?p_article schema:inLanguage 'de' ." +
 		"FILTER (SUBSTR(str(?p_article), 1, 25) = 'https://de.wikipedia.org/')}" +
 		"} LIMIT 2000";

   $.ajax({
	method: 'GET',
	url: 'https://query.wikidata.org/bigdata/namespace/wdq/sparql?query=' + encodeURIComponent( query ), //query,
    headers: {Accept: 'application/sparql-results+json'},
    success: function(data, textStatus, jqXHR) {
	$('#message').val('SPARQL-data loaded ');
    var length = data.results.bindings.length; //length of json 
    //console.log(length);
    var output='';
    var alias1, string1, string2, string3, uri_dec;
    $('#weblink').empty();       
    for (i = 0; i < length; i++) {
        string1 = data.results.bindings[i].p_article.value;
        uri_dec = decodeURIComponent(string1); // decode a URI
        string1 = uri_dec; // console.log(uri_dec);
        string2 = string1.substring(string1.lastIndexOf('/')+1,string1.length); 
        string3 = data.results.bindings[i].p.value;
        output = output + string3.substring(string3.lastIndexOf('/')+1,string1.length) + ' - ' + 
                 data.results.bindings[i].pLabel.value + ' - ' + string2 + '\n';
      	alias1 = 'Q'+data.results.bindings[i].p.value.match(/\d+/ );

        $('#weblink').append(alias1.link(data.results.bindings[i].p.value)+' - '+data.results.bindings[i].pLabel.value+' - ');
        $('#weblink').append(string2+'</br>');
    } // end for-loop
    //$('#message').val(output);
		    }
		});
}	

   }; // end function test
        return {
            test: test
        };
     })();

     feature.test ();              
});