Installation von Virtuoso und Erfurt unter Windows - AKSW/GitTripleStore GitHub Wiki

#Virtuoso installieren

  • Download der Open-Source-Edition von Virtuoso unter SourceForge. Es ist darauf zu achten, dass Erfurt über ODBC mit Virtuoso kommuniziert. Eine 32 Bit-Anwendung (hier PHP) kann aber nur mit einem 32 Bit-ODBC-Treiber kommunizieren. Wenn also eine 32 Bit-Installation von PHP vorliegt, muss ein 32 Bit-ODBC-Treiber verwendet werden. Analog bei einer 64 Bit-Installation muss ein 64 Bit-ODBC-Treiber verwendet werden. Die letzte Version der Open-Source-Edition von Virtuoso mit ausgelieferten 32 Bit-ODBC-Treiber ist Version 6.1.8.
  • Die heruntergeladene ZIP-Datei entpacken
  • Die Unterordner bin und lib sind zur Systemumgebungsvariablen Path hinzuzufügen. Unter Windows 7:
  • Start
  • Im Suchfeld Systemumgebungsvariablen eingeben [Enter]
  • Unter Erweitert auf Umgebungsvariablen... klicken
  • Die Systemvariable Path bearbeiten
  • Die Pfade von bin und lib getrennt durch ein Semikolon an den Wert der Variablen anhängen: Virtuoso zur Path-Variablen hinzufügen
  • Die Kommandozeile als Administrator öffnen. Unter Windows 7:
  • Start
  • Im Suchfeld cmd eingeben
  • [Strg]+[Shift]+[Enter]
  • Da Virtuoso zur Path-Variablen hinzugefügt wurden ist, kann der Virtuoso-Service aus jedem Ordner gestartet werden.
  • Um sicherzustellen, ob Virtuoso gefunden wird, kann der Befehl virtuoso-t -? ausgeführt werden: Virtuoso testen
  • Im Unterverzeichnis database ist die Konfigurationsdatei virtuoso.ini zu finden. Insbesondere ist später der Eintrag DirsAllowed im Abschnitt [Parameters] wichtig.
  • In der Konsole zum Unterverzeichnis database wechseln.
  • Den Virtuoso-Service mit virtuoso-t +service create +instance "TheService" +configfile virtuoso.ini erstellen.
  • Den erstellten Service mit virtuoso-t +service start "TheInstance" starten.
  • Nützlich sind weiterhin die Befehle virtuoso-t +service list zum Auflisten der erstellten Services, virtuoso-t +service stop +instance "TheInstance" zum stoppen des Service und virtuoso-t +service delete +instance "TheInstance" um den Service zu löschen.
  • Der erstellte Service wird nun automatisch bei jedem Windows-Start mit gestartet. Folgende Anleitung zeigt, wie das verhindert wird:
  • Start
  • Im Suchfeld msconfig eingben [Enter]
  • Unter Dienste nach dem erstellten Service suchen und den Haken entfernen: AUtostart von Virtuoso-Service verhindern
  • Nach dem Start des Services ist er über das Webinterface http://localhost:8890/conductor/ erreichbar. Der Standardlogin ist Benutzername dba, Passwort dba.
  • Die Konfiguration, mit der der Service gestartet wurde, kann unter System Admin > Parameters eingesehen werden. Unter anderem ist der Pfad zur Konfigurationsdatei angegeben.

#Einen Beispiel-Graphen anlegen

  • Sicherstellen, dass der Virtuoso-Service gestartet wurde
  • Conductor im Browser öffnen http://localhost:8890/conductor
  • Einloggen (Standardlogin ist Benutzername dba, Passwort dba)
  • Zu Linked Data > Graphs wechseln
  • Im Tab Graphs werden alle verfügbaren Graphen aufgelistet
  • Wir wollen einen Graph aus einer RDF-Datei erstellen.
  • Zu Linked Data > Quad Store Upload wechseln.
  • Wichtig: Nur wenn Create graph explicitly ausgewählt ist, kann der Graph mit Erfurt abgefragt werden.
  • Die Resource URL http://njh.me/foaf.rdf und die Named Graph IRI http://localhost:8890/foaf eingeben und auf Upload klicken: Virtuoso Graph hochladen
  • Unter Linked Data > Graphs > Graphs sollte nun http://localhost:8890/foaf mit aufgeführt sein.

#ODBC Konfigurieren

  • Erfurt greift via ODBC auf Virtuoso zu.
  • Im Unterverzeichnis lib des Virtuoso-Ordners befindet sich der ODBC-Treiber virtodbc.dll
  • Mit dem Werkzeug regsvr32 wird der ODBC-Treiber registriert. Es ist dabei zu Achten, dass standardmäßig regsvr32 aus dem Verzeichnis C:\Windows\System32 aufgerufen wird, und damit nur 64 Bit-DLLs registriert. Liegt eine 32 Bit-PHP-Installation vor und wird daher ein 32 Bit-ODBC-Treiber benötigt, muss vorher in das Verzeichnis C:\Windows\SysWOW64 gewechselt werden. Dort ist die 32 Bit-Version von regsvr32 zu finden. (Beachte die Verwechslungsgefahr: Windows\System32 enthält die 64 Bit-Version, Windows\SysWOW64 die 32 Bit-Version).
  • In der Konsole (als Administrator gestartet!) kann der ODBC-Treiber mit dem Befehl regsvr32 virtodbc.dll (für die 32 Bit-Version regsvr32 aus C:\Windows\SysWOW64 aufrufen!) registriert werden.
  • Für das Deregistrieren der DLL ist regsvr32 mit dem Parameter -u aufzurufen: regsvr32 -u virtodbc.dll
  • Nach erfolgreicher Registrierung des Treibers wird folgende Messagebox angezeigt: Registrieren des ODBC-Treibers
  • Erfurt greift über eine benannte Datenquelle auf Virtuoso zu.
  • Für das Einrichten der Datenquelle muss das Client Connectivity Toolkit installiert werden.
  • Es muss darauf geachtet werden, dass eine 32 Bit-Anwendung einen 32 Bit-ODBC-Treiber und analog eine 64 Bit-Anwendung einen 64 Bit-ODBC-Treiber benötigt. Andernfalls sollte eine Fehlermeldung wie

The specified DSN contains an architecture mismatch between the Driver and Application angezeigt werden.

  • Starten des Microsoft ODBC-Administrators
  • Bei einer 32 Bit-Anwendung ist c:\windows\sysWOW64\odbcad32.exe zu starten.
  • Bei einer 64 Bit-Anwendung ist c:\windows\System32\odbcad32.exe zu starten.
  • Hinzufügen der Datenquelle VOS
  • Als Treiber ist Virtuoso (Open Source) zu wählen
  • Bei Name VOS eingeben
  • und bei Server localhost:1111 Virtuoso ODBC
  • Anschließend kann die Verbindung geprüft werden, indem ein Haken bei Connect to the Virtuoso Server to obtain default settings for the additional configuration options gesetzt wird. Standard Login ist Benutzername dba und Passwort dba.

#Testen der Verbindung mit PHP

  • Sicherstellen, dass der Virtuoso-Service gestartet ist

  • Die Datenquelle VOS wurde angelegt und die 32 Bit- bzw. 64 Bit-Version beachtet.

  • Der Graph http://localhost:8890/foaf wurde mit Create graph explicitly angelegt.

  • Mit folgendem PHP-Skript werden alle Graphen von VOS aufgelistet, die auch Erfurt abfragen kann.

      <?php
      if (!extension_loaded('odbc')) {
      	throw new Exception('ODBC extension not loaded.');
      }
    
      $connection = odbc_connect('VOS', 'dba', 'dba');
      if (!$connection) {
      	throw new Exception('Unable to connect: ' . odbc_errormsg());
      }
    
      $query = 'SELECT ID_TO_IRI(REC_GRAPH_IID) AS GRAPH FROM DB.DBA.RDF_EXPLICITLY_CREATED_GRAPH';
      $result = odbc_exec($connection, $query);
      if ($result == false) {
      	$error = odbc_errormsg($connection);
      	throw new Exception('Unable to exec sql query: ' . $error);
      }
    
      ?>
      <h1>Explicitly Created Graphs</h1>
      <ul>
      <?php while (odbc_fetch_row($result)): ?>
      	<?php $graph = odbc_result($result, 1); ?>
      	<li><?php echo $graph ?></li>
      <?php endwhile; ?>
      </ul>
    
      <?php
      odbc_close($connection);
    

Die Ausgabe sollte wie folgt aussehen: Ausgabe des Skripts

#Composer installieren

  • Composer verwaltet Abhängigkeiten für PHP-Anwendungen.
  • Download des Composer-Installers
  • Der Installer fügt Composer automatisch zur Path-Variablen hinzu, deswegen kann Composer aus jedem Verzeichnis aus gestartet werden.

#Beispielanwendung mit Erfurt

  • In der Beispielanwendung sollen alle explizit erstellten Graphen mit Erfurt abgefragt und ausgegeben werden.

  • Dazu ist das Verzeichnis erfurt-test anzulegen.

  • Für Composer muss darin die Datei composer.json erstellt werden, in der alle Abhängigkeiten der Anwendung definiert sind.

  • Die Beispielanwendung basiert auf Erfurt und Erfurt wiederum auf dem Zend Framework 1 (ZF1).

  • Normalerweise kann Composer Abhängigkeiten von Bibliotheken zu anderen Komponenten auflösen, allerdings wird Erfurt nicht als Composer-Paket angeboten. Deswegen muss die Abhängigkeit zu ZF1 explizit angegeben werden.

  • In der composer.json sind folgende Zeilen zu kopieren:

      {
      	"repositories": [
      		{
      			"type": "package",
      			"package": {
      				"name": "erfurt/erfurt",
      				"version": "1.0.0",
      				"source": {
      					"type": "svn",
      					"url": "https://github.com/AKSW/Erfurt",
      					"reference": "trunk/library/Erfurt"
      				}
      			}
      		}
      	],
      	"require": {
      		"zendframework/zendframework1" : "1.12.*",
      		"erfurt/erfurt": "1.0.0"
      	},
      	"autoload": {
      		"classmap": ["vendor/erfurt/erfurt", "vendor/zendframework/zendframework1/library/Zend"]
      	},
      	"include-path": ["vendor/erfurt", "vendor/zendframework/zendframework1/library"]
      }
    
  • Weil Erfurt nicht als Composer-Paket verwaltet wird, wird als type package angegeben.

  • Erfurt wird mit Git versioniert. Die benötigten Dateien befinden sich im Repository unter library/Erfurt. Composer kann jedoch nicht Unterverzeichnisse klonen (Git Sparse Checkout). GitHub bietet aber auch einen gespiegelten SVN-Zugriff auf das Repository an und bei SVN ist es möglich auch nur Unterverzeichnisse auszuchecken. Deswegen wird aus dem SVN-Repository ausgecheckt, auch wenn ein Git Repository vorhanden ist.

  • Für den Checkout mit SVN wird ein Kommandozeilen-SVN-Client benötigt, wie den SilkSVN Windows Client. Ob der Client richtig installiert wurde kann in der Konsole mit dem Befehl svn --version geprüft werden.

  • Konsole starten und in das Verzeichnis erfurt-test wechseln.

  • Den Befehl composer install ausführen. Composer lädt damit alle Abhängigkeiten im Unterverzeichnis vendor herunter und baut den Autoloader.

  • Die Beispielanwendung besteht nur aus einem Skript graphs.php im Verzeichnis erfurt-test.

  • Für das automatische Laden aller Abhängigkeiten genügt folgende Zeile in graphs.php

      require_once __DIR__.'./vendor/autoload.php';
    
  • Danach kann eine Instanz der Erfurt-Anwendung erstellt werden und als Backend die Virtuoso-Datenquelle VOS angegeben werden:

      $erfurt = \Erfurt_App::getInstance();
      $erfurt->loadConfig(
      	new \Zend_Config(
      		array(
      			'store' => array(
      				'backend' => 'virtuoso',
      				'virtuoso' => array(
      					'dsn' => 'VOS',
      					'username' => 'dba',
      					'password' => 'dba'
      				)
      			)
      		)
      	)
      );
      $erfurt->authenticate('dba', 'dba');
      $store = $erfurt->getStore(); // Virtuoso
    
  • Auf dem Store (hier Virtuoso-Store) können dann mit getAvailableModels() die explizit erstellten Graphen abgefragt und ausgeben werden:

      $graphs = $store->getAvailableModels();
      echo '<pre>' . var_dump($graphs) . '</pre>';
    
  • Die gesamte graphs.php sieht wie folgt aus:

      <?php
      require_once __DIR__.'./vendor/autoload.php';
      
      $erfurt = \Erfurt_App::getInstance();
      $erfurt->loadConfig(
      	new \Zend_Config(
      		array(
      			'store' => array(
      				'backend' => 'virtuoso',
      				'virtuoso' => array(
      					'dsn' => 'VOS',
      					'username' => 'dba',
      					'password' => 'dba'
      				)
      			)
      		)
      	)
      );
      $erfurt->authenticate('dba', 'dba');
      $store = $erfurt->getStore();
      $graphs = $store->getAvailableModels();
      echo '<pre>' . var_dump($graphs) . '</pre>';
    
  • Im Verzeichnis erfurt-test ist das Unterverzeichnis cache anzulegen, das Erfurt benötigt.

  • Die Ausgabe sollte wie folgt aussehen: Ausgabe der Beispielanwendung

  • Abschließender Hinweis zum Umgang mit Dateien: Bei der Fehlermeldung Access to XXX is denied due to access control in ini file ist die Einstellung für DirsAllowed in der virtuoso.ini unterhalb des Abschnitts [Parameters] zu prüfen. Hier wird eine Komma-getrennte Liste von Verzeichnissen angegeben, auf die Virtuoso Zugriff hat. Es wird empfohlen die Pfade mit Backslash \ und nicht mit Slash / sowie ohne Doublequotes "...". anzugeben.

⚠️ **GitHub.com Fallback** ⚠️