Showing posts with label lod. Show all posts
Showing posts with label lod. Show all posts

Saturday, December 5, 2015

SPARQL Guide for the Visual Basic 6 (VB6) Developer

Author:
Topics: , , , ,

SPARQL Guide for the Visual Basic 6 (VB6) Developer

Introduction

This is the Visual Basic 6 variation of 's SPARQL guides for PHP, Perl, Python, JavaScript developers and my guide forClassic ASP developers. I wanted to share this because quite a number of developers (including me) are still using Visual Basic 6 and It could also be used for Linked Data Application development. Visual Basic is on the top 20 most popular programming languages according to TIOBE Index as at december 2015

What?

A simple guide usable by any Visual Basic 6 developer seeking to exploit SPARQL without hassles.

Why?

SPARQL is a powerful query language, results serialization format, and an HTTP based data access protocol from the W3C. It provides a mechanism for accessing and integrating data across Deductive Database Systems (colloquially referred to as triple or quad stores in Semantic Web and Linked Data circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form.

How?

SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing e.g. local object binding re. Visual Basic 6 (vb6).

Steps:
  • Determine which SPARQL endpoint you want to access e.g. DBpedia or a local Virtuoso instance (typically: http://localhost:8890/sparql).
  • If using Virtuoso, and you want to populate its quad store using SPARQL, assign "SPARQL_SPONGE" privileges to user "SPARQL" (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).
  • Make sure MSXML parser is installed on the server or you can download from here.
  • Download VB-JSON: A Visual Basic 6 (VB6) JSON Parser Class Library.
  • In Visual Basic, create a new Standard EXE project. Create and add a new module, "module1.bas".
  • Add a project reference to Microsoft XML version 2.0, Microsoft scripting runtime, Microsoft ActiveX Data Objects library.
  • Unzip the VB-JSON file. Extract the following files: "json.bas", "cJSONScript.cls" and "cStringBuilder.cls". Add them to the Visual Basic project
  • Paste the following code in "module1.bas" file. See the inline comments for a description of how the code functions.
  • Save and run the Visual Basic project.
Code:
 Private m_SafeChar(0 To 255) As Boolean
 Sub main()
  Dim buf As New cStringBuilder

    Dim p As Object
  
  Dim result As String
  Dim url As New cStringBuilder
  Dim dsn As String
  Dim parameters As String
  Dim sparql As New cStringBuilder
  
  On Error Resume Next
  
  ' Setting Data Source Name (DSN)
  dsn = "http://dbpedia.org/sparql"
  
  ' HTTP URL is constructed accordingly with JSON query results format in mind.
  parameters = "default-graph-uri=&should-sponge=&format=application%2Fsparql-results%2Bjson&timeout=0&debug=on"

  
  ' SPARQL Query
  ' List all the landlocked countries in Africa
  sparql.Append "PREFIX rdfs:  "
  sparql.Append "PREFIX type:  "
  sparql.Append "PREFIX prop:  "
  sparql.Append "SELECT ?country_name ?population ?ind1 "
  sparql.Append "WHERE { "
  sparql.Append "    ?country a type:LandlockedCountries, yago:AfricanCountries ; "
  sparql.Append "             rdfs:label ?country_name ; "
  sparql.Append "             prop:populationEstimate ?population . "
  sparql.Append "             FILTER (?population > 15000000) . "
  sparql.Append "             filter (lang(?country_name) = 'en'). "
  sparql.Append "             bind( str(?country_name) as ?ind1 ). "
  sparql.Append "} "
  
  ' construct the SPARQL URL
  url.Append dsn
  url.Append "?"
  url.Append "query="
  url.Append URLEncode(sparql.toString)
  url.Append "&"
  url.Append parameters
  
  ' Send SPARQL URL as REST
  result = WebRequest(url.toString)
  
  DoEvents: DoEvents
  
  ' Parse SPARQL JSON results
  Set p = JSON.parse(result)
  DoEvents: DoEvents
  
  If Not (p Is Nothing) Then
   
     If JSON.GetParserErrors <> "" Then
     ' Errors 
     MsgBox JSON.GetParserErrors, vbInformation, "Parsing Error(s) occured"
     Else
     ' No Errors
     Dim cnt As Integer
     Dim maxrecs As Integer
     Dim sparqldata As String
     
     maxrecs = IIf(CInt(p.Item("results").Item("bindings").Count) > 4, 5, CInt(p.Item("results").Item("bindings").Count))
     cnt = 1
     buf.Append "Retrieved Data:" & vbNewLine
     buf.Append "" & vbNewLine
     Do While True
    buf.Append p.Item("results").Item("bindings").Item(cnt).Item("country_name").Item("value") & vbNewLine
    If cnt = maxrecs Then Exit Do
    cnt = cnt + 1
    
    DoEvents
     Loop
     
     End If
  Else
     MsgBox "An error occurred parsing file "
     
  End If

 MsgBox buf.toString
 End Sub

 Public Function WebRequest(url As String) As String
  Dim http As MSXML2.XMLHTTP
  Set http = CreateObject("MSXML2.ServerXMLHTTP")

  http.Open "GET", url, False
  http.send

  WebRequest = http.responseText
  Set http = Nothing
 End Function

 ' Return a URL safe encoding of txt.
 Private Function URLEncode(ByVal txt As String) As String
 Dim i As Integer
 Dim ch As String
 Dim ch_asc As Integer
 Dim result As String

  SetSafeChars

  result = ""
  For i = 1 To Len(txt)
   ' Translate the next character.
   ch = Mid$(txt, i, 1)
   ch_asc = Asc(ch)
   If ch_asc = vbKeySpace Then
    ' Use a plus.
    result = result & "+"
   ElseIf m_SafeChar(ch_asc) Then
    ' Use the character.
    result = result & ch
   Else
    ' Convert the character to hex.
    result = result & "%" & Right$("0" & _
     Hex$(ch_asc), 2)
   End If
  Next i

  URLEncode = result
 End Function

 ' Set m_SafeChar(i) = True for characters that
 ' do not need protection.
 Private Sub SetSafeChars()
 Static done_before As Boolean
 Dim i As Integer

  If done_before Then Exit Sub
  done_before = True

  For i = 0 To 47
   m_SafeChar(i) = False
  Next i
  For i = 48 To 57
   m_SafeChar(i) = True
  Next i
  For i = 58 To 64
   m_SafeChar(i) = False
  Next i
  For i = 65 To 90
   m_SafeChar(i) = True
  Next i
  For i = 91 To 96
   m_SafeChar(i) = False
  Next i
  For i = 97 To 122
   m_SafeChar(i) = True
  Next i
  For i = 123 To 255
   m_SafeChar(i) = False
  Next i
 End Sub

  
Output:
  Retrieved Data 

  Burkina Faso
  Ethiopia
  Malawi
  
Conclusion:

JSON was chosen over XML (re. output format) since this is about a "no-brainer installation and utilization" guide for a Javascript developer that already knows how to use Javascript for HTTP based data access within HTML. SPARQL just provides an added bonus to URL dexterity (delivered via URI abstraction) with regards to constructing Data Source Names or Addresses.

Friday, March 20, 2015

Linked Open Election Framework for Publishing Election Data and Results in Structured Formats

Author:
Topics: , , , , ,
Situation analysis

In most part of the world, there is hardly any freely available database of political election results in existence. This is because the data required to compile it is located in different websites or documents. The information is presented in many different formats and many different ways, and the only way the information can be compiled for re-use is by manual methods.

The Linked Open Election Framework is supporting the publication of election results as (the language used to write web pages) embed (called "Metadata") in the source code. Though invisible to normal users, publishing the information in this way gives it structure and meaning, and allowing machines to understand its meaning.

What is the Linked Open Election Framework?

The main point of is to aid accountability and transparency and this framework supports the publication and public access to Election results on websites as – data that is published under an open licence that allows unrestricted reuse, and that is marked up to identify the structure and meaning, making possible its automated collection for re-publishing and mashing up with other data.

How does it work?

Rather than publishing using not-so open formats or standards like PDF, HTML, Plain Text, etc, we embed machine-readable metadata in the HTML source code of web pages. These metadata is derived from information defined from the Election data. Entities or "things" that make up the Election data are defined as items and described in an HTML page. Each item is made up of one or more key-value pairs: a property and a value. The Microdata syntax is completely made up of HTML attributes. These attributes can be used on any valid HTML element. This gives the information structure and meaning, with a licence to allow collection, collation and reuse by anyone at no cost.

This structured information or "Structured Data" is a broad term that encompasses various standards and encoding mechanisms but, at the end of the day, refers to information provided to data consumers specifically for machine consumption. This machine-readable code is closely-allied to, but separate from, the presentation layer that us humans consume when we read a web page, providing a way for dumb machines to better understand the entities and connections between entities present in a piece of content.

Although this additional code does not directly impact the user's experience of the page, it makes a big difference to machines (including Bots, Smart Agents, Search Engines, etc), helping them to "understand" that (for example) this webpage:

  • Is a News Article
  • Has the headline "Election Results for Ekiti Governorship Election 2014"
  • Has information on a "Poll" event held on June 21, 2014

To make this metadata available we have used a vocabulary (or ) called Linked Open Election. This vocabulary provides a simple way of expressing Election data and information in Linked Data formats. Additionally, we used vocabulary proposed by Google, Bing, Yahoo and others

This metadata comprises of real-world entities refered by Uniform Resource Identifiers (URIs).

Benefits

: An immediate benefit of this work will be that search engines will be better able to display links to these News articles, helping users to find relevant stories and to determine from a search engine's listings the relevance of the article to the story that they are searching for and ultimately help to open up references to the data contained in those stories.

Linked Open Data: It will create an open database of election data and results.

Why is it important?

The use of Linked Open Data provides a clear signal to every organizations and governments the imminence of the "web of data" or Web 3.0. Every Web Site has to evolve into a Linked Data Space: a location on the Web that provides granular access to discrete data items in line with the core principles of the Linked Data meme.

Remember, the essence of the Linked Data meme is simply this: you reference data items and access their metadata, in variety of formats via a single HTTP based URI. This approach to Web data publishing is compatible with any HTTP aware user agent (e.g. your Web Browser or tools & applications that provide abstracted access to HTTP).

Do you need a special software to do this?

No, just the same way to mark up HTML. This also works in Content Management and Blogging system.

Tutorials & How to

  • How to Embed Election Data in HTML using HTML5, Microdata and Linked Data - Read
  • How to Publish Election Data in Nanotation (aka micro-Turtle) - Read
  • Sample Nanotation on Election Data and Results - View
  • Sample Election Data in RDF (turtle) document - View
  • Sample Election Data in HTML5, Microdata format - View
  • Sample Election Poll Data in RDF (turtle) document - View
  • List of Nigerian Political Parties in RDF (turtle) document - View
  • Linked Open Election Ontology - View
  • Prefix - loe
  • About Linked Open Election Framework - Read

Friday, March 6, 2015

Linked Open Election Framework Implementation Guide for Nanotation

How to Publish Election Data in Nanotation

.

Subjects: , , ,

Introduction:

This guide will show you how to implement the Linked Open Election Data using Nanotation and the Linked Election Framework.

Nanotations, which are micro Turtle, are deployable from any social media/networking space or service that offers the ability to post plain text (Twitter Tweets, Facebook Posts, Google+ Posts, LinkedIn Posts, Blog Posts, Comments, Mailing List Posts etc.. ).

This guide assumes a basic knowledge of Nanotation. If you're new to the subject or just need some brushing up, we recommend that you read the Kingsley Idehen's post on Nanotation.

Solution:

  1. First thing to do is to define the article or post that will host the election data:

    	{
    
    		@prefix schema:   .
    		
    		<>
    		a schema:NewsArticle ;
    		
    	}
     
    Please note that you can also use other Schema.org classes like schema:Article,schema:TechArticle, schema:BlogPost, schema:ScholarlyArticle as the document type.

  2. Define the name and headline of the post.

     
    	{
    
    		@prefix schema:   .
    		
    		<>
    		a schema:NewsArticle ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results".
    	
    	}
     

  3. Embed the author's name and profile URI (eg. Google+, WebID-Profile, DBpedia, Freebase, etc) :

    	{
    
    		@prefix schema:   .
    		
    		<>
    		a schema:NewsArticle ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results";
    
    		schema:author [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		schema:creator [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	.
    	
    	}
    
     

  4. Annotate the data, tags or subject associated with the article. You can define as many as possible using entities in Wikipedia, Freebase and Linked Open Data (LOD), delimited with commas :

     	{
    
    		@prefix schema:   .
    		
    		<>
    		a schema:NewsArticle ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results";
    
    		schema:author [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		schema:creator [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		
    		schema:about [
    				  a schema:Thing ;
    				  schema:name "Election" ;
    				  schema:url  ;
    		
    		]	, 
    		
    		[
    				  a schema:Thing ;
    				  schema:name "Elections in Nigeria" ;
    				  schema:url  ;
    		
    		]	. 
    	
    	}
    
     
    We're going to finish by annotating all of the data we've asserted concerning the article's associated entities.

  5. Embed your news story or article within the attribute "articleBody" .

     	{
    
    		@prefix schema:   .
    		
    		<>
    		a schema:NewsArticle ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results";
    
    		schema:author [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		schema:creator [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		
    		schema:about [
    				  a schema:Thing ;
    				  schema:name "Election" ;
    				  schema:url  ;
    		
    		]	, 
    		
    		[
    				  a schema:Thing ;
    				  schema:name "Elections in Nigeria" ;
    				  schema:url  ;
    		
    		]	; 
    		
    		schema:articleBody "your story or article goes here" .
    	
    	}
    
     

  6. Embed the election results. See subsequent steps on how to embed election polling data.

  7. Define and setup your poll and add the election schema.

     
     	{
    
    		@prefix schema:   .
    		@prefix election:  .
    		
    		<>
    		a schema:NewsArticle, election:Poll ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results";
    
    		schema:author [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		schema:creator [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		
    		schema:about [
    				  a schema:Thing ;
    				  schema:name "Election" ;
    				  schema:url  ;
    		
    		]	, 
    		
    		[
    				  a schema:Thing ;
    				  schema:name "Elections in Nigeria" ;
    				  schema:url  ;
    		
    		]	; 
    		
    		schema:articleBody "your story or article goes here" .
    	
    	}
      
     

  8. Add and update the attributes of the poll and candidates

     	{
    
    		@prefix schema:   .
    		@prefix election:  .
    		
    		<>
    		a schema:NewsArticle, election:Poll ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results";
    
    		schema:author [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		schema:creator [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		
    		schema:about [
    				  a schema:Thing ;
    				  schema:name "Election" ;
    				  schema:url  ;
    		
    		]	, 
    		
    		[
    				  a schema:Thing ;
    				  schema:name "Elections in Nigeria" ;
    				  schema:url  ;
    		
    		]	; 
    		
    		schema:articleBody "your story or article goes here" ;
    		
    		election:hasElectionDate "2014-06-21"^^xsd:date ;
    		election:hasConstituency  ;
    		election:hasRegisteredVoters "733766"^^xsd:integer ;
    		election:hasAccreditedVoters "369257"^^xsd:integer ;
    		election:hasTotalBallots "360455"^^xsd:integer ;
    		election:hasInvalidBallots "10089"^^xsd:integer ;
    		election:hasValidBallots "350366"^^xsd:integer ;
    		election:hasViolence "false"^^xsd:boolean ;
    		election:isCandidate <#candidate1>, <#candidate2>, <#candidate3> ;
    		election:hasElectoralFraud "false"^^xsd:boolean .
    		
    		<#candidate1> a election:Candidate ;
    		schema:name "Ayodele Peter Fayose" ;
    		election:isOfPoliticalParty  ;
    		election:hasVotes "203090"^^xsd:integer ;
    		election:isElected "true"^^xsd:boolean .
    
    		<#candidate2> a election:Candidate ;
    		schema:name "John Olukayode Fayemi" ;
    		election:isOfPoliticalParty  ;
    		election:hasVotes "120433"^^xsd:integer ;
    		election:isElected "false"^^xsd:boolean .
    		
    		
    		<#candidate3> a election:Candidate ;
    		schema:name "Bamidele Michael Opeyemi" ;
    		election:isOfPoliticalParty  ;
    		election:hasVotes "18135"^^xsd:integer ;
    		election:isElected "false"^^xsd:boolean .
    	
    	
    	}
    
    
    	
     

  9. Finally, you can add the provider organization data. The url attribute should be the website URL of the news or blogger organization while the name of the organization is added to the name attribute:

    
     	{
    
    		@prefix schema:   .
    		@prefix election:  .
    		
    		<>
    		a schema:NewsArticle, election:Poll ;
    		
    		schema:name "Election Results";
    		schema:headline "Election Results";
    
    		schema:author [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		schema:creator [
    				  a schema:Person ;
    				  schema:name "Creator's name" ;
    				  schema:url  ;
    		
    		]	;
    		
    		schema:about [
    				  a schema:Thing ;
    				  schema:name "Election" ;
    				  schema:url  ;
    		
    		]	, 
    		
    		[
    				  a schema:Thing ;
    				  schema:name "Elections in Nigeria" ;
    				  schema:url  ;
    		
    		]	; 
    		
    		schema:articleBody "your story or article goes here" ;
    		schema:sourceOrganization 	[
    				  a schema:Organization ;
    				  schema:name "Your organization name" ;
    				  schema:url  ;
    		
    		]	; 
    
    		schema:provider [
    				  a schema:Organization ;
    				  schema:name "Your organization name" ;
    				  schema:url  ;
    		
    		]	;  
    		
    		election:hasElectionDate "2014-06-21"^^xsd:date ;
    		election:hasConstituency  ;
    		election:hasRegisteredVoters "733766"^^xsd:integer ;
    		election:hasAccreditedVoters "369257"^^xsd:integer ;
    		election:hasTotalBallots "360455"^^xsd:integer ;
    		election:hasInvalidBallots "10089"^^xsd:integer ;
    		election:hasValidBallots "350366"^^xsd:integer ;
    		election:hasViolence "false"^^xsd:boolean ;
    		election:isCandidate <#candidate1>, <#candidate2>, <#candidate3> ;
    		election:hasElectoralFraud "false"^^xsd:boolean .
    		
    		<#candidate1> a election:Candidate ;
    		schema:name "Ayodele Peter Fayose" ;
    		election:isOfPoliticalParty  ;
    		election:hasVotes "203090"^^xsd:integer ;
    		election:isElected "true"^^xsd:boolean .
    
    		<#candidate2> a election:Candidate ;
    		schema:name "John Olukayode Fayemi" ;
    		election:isOfPoliticalParty  ;
    		election:hasVotes "120433"^^xsd:integer ;
    		election:isElected "false"^^xsd:boolean .
    		
    		
    		<#candidate3> a election:Candidate ;
    		schema:name "Bamidele Michael Opeyemi" ;
    		election:isOfPoliticalParty  ;
    		election:hasVotes "18135"^^xsd:integer ;
    		election:isElected "false"^^xsd:boolean .
    		
    	
    	}
    
    
    	
    	
     

That is it.

Information:

References

- http://en.wikipedia.org/wiki/DBpedia

- http://en.wikipedia.org/wiki/SPARQL

- http://www.w3.org/TR/turtle/

- http://kidehen.blogspot.com/2015/01/review-publishing-for-everyone.html

- http://kidehen.blogspot.com/2014/07/nanotation.html

Keywords: linked data, election, semantic web, turtle