Semantik Web APP und API
This commit is contained in:
parent
df2d29586e
commit
f7f9b6117b
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/.DS_Store
vendored
Normal file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/Bonus_01.pdf
Normal file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/Bonus_01.pdf
Normal file
Binary file not shown.
14
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/.classpath
Executable file
14
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/.classpath
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
|
||||||
|
<classpathentry kind="lib" path="lib/arq-2.8.7.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/icu4j-3.4.4.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/iri-0.8.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/jena-2.6.4.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/log4j-1.2.13.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/slf4j-api-1.5.8.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/slf4j-log4j12-1.5.8.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/xercesImpl-2.7.1.jar"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
||||||
17
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/.project
Executable file
17
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/.project
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>JenaExamples</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
#Thu Nov 17 11:48:31 CET 2011
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.6
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,3 @@
|
|||||||
|
@prefix : <http://example.org/> .
|
||||||
|
|
||||||
|
:Madrid :capitalOf :Spain .
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
@prefix : <http://example.org/> .
|
||||||
|
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
||||||
|
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
||||||
|
|
||||||
|
:Country a rdfs:Class .
|
||||||
|
:City a rdfs:Class .
|
||||||
|
:capitalOf rdfs:subPropertyOf :locatedIn .
|
||||||
|
:locatedIn rdfs:domain :City ; rdfs:range :Country .
|
||||||
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/arq-2.8.7.jar
Executable file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/arq-2.8.7.jar
Executable file
Binary file not shown.
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/icu4j-3.4.4.jar
Executable file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/icu4j-3.4.4.jar
Executable file
Binary file not shown.
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/iri-0.8.jar
Executable file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/iri-0.8.jar
Executable file
Binary file not shown.
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/jena-2.6.4.jar
Executable file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/jena-2.6.4.jar
Executable file
Binary file not shown.
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/log4j-1.2.13.jar
Executable file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/JenaExamples/lib/log4j-1.2.13.jar
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,55 @@
|
|||||||
|
package de.tudarmstadt.ke.sw.gui;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.GridLayout;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
|
||||||
|
import de.tudarmstadt.ke.sw.logic.CapitalFinder;
|
||||||
|
|
||||||
|
public class CapitalTool extends JFrame {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 3222342882423600187L;
|
||||||
|
|
||||||
|
private CapitalFinder finder = new CapitalFinder();
|
||||||
|
|
||||||
|
private JTextField question;
|
||||||
|
private JTextField answer;
|
||||||
|
|
||||||
|
public CapitalTool() {
|
||||||
|
JPanel p = new JPanel();
|
||||||
|
p.setLayout(new GridLayout(2,3));
|
||||||
|
p.add(new JLabel("Tell me the capital of"));
|
||||||
|
question = new JTextField();
|
||||||
|
p.add(question);
|
||||||
|
JButton b = new JButton("Go!");
|
||||||
|
b.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
answer.setText(finder.findCapital(question.getText()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
p.add(b);
|
||||||
|
|
||||||
|
p.add(new JLabel("The answer is"));
|
||||||
|
answer = new JTextField();
|
||||||
|
answer.setEditable(false);
|
||||||
|
p.add(answer);
|
||||||
|
|
||||||
|
this.setSize(500,150);
|
||||||
|
this.setTitle("Yet another great semantic web app");
|
||||||
|
this.getContentPane().add(p,BorderLayout.CENTER);
|
||||||
|
this.setVisible(true);
|
||||||
|
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new CapitalTool();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package de.tudarmstadt.ke.sw.logic;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.Query;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecution;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
||||||
|
import com.hp.hpl.jena.query.QueryFactory;
|
||||||
|
import com.hp.hpl.jena.query.ResultSet;
|
||||||
|
|
||||||
|
public class CapitalFinder {
|
||||||
|
|
||||||
|
|
||||||
|
public String findCapital(String country) {
|
||||||
|
String query = "select ?label2 WHERE { ?country <http://dbpedia.org/ontology/capital> ?city . ?country <http://www.w3.org/2000/01/rdf-schema#label> ?label1 . ?city <http://www.w3.org/2000/01/rdf-schema#label> ?label2 . FILTER (str(?label1) = \"" + country + "\" && LANG(?label2) = \"en\") }";
|
||||||
|
Query q = QueryFactory.create(query);
|
||||||
|
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", q);
|
||||||
|
ResultSet RS = qexec.execSelect();
|
||||||
|
if(RS.hasNext()) {
|
||||||
|
return RS.next().get("label2").asLiteral().getLexicalForm();
|
||||||
|
} else
|
||||||
|
return "no idea";
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
package de.tudarmstadt.ke.sw.logic;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.Query;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecution;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
||||||
|
import com.hp.hpl.jena.query.QueryFactory;
|
||||||
|
import com.hp.hpl.jena.query.ResultSet;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Model;
|
||||||
|
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Statement;
|
||||||
|
import com.hp.hpl.jena.rdf.model.StmtIterator;
|
||||||
|
|
||||||
|
|
||||||
|
public class JenaReasoning {
|
||||||
|
public static void main(String args[]) throws Exception {
|
||||||
|
|
||||||
|
Model schemaModel = ModelFactory.createDefaultModel();
|
||||||
|
InputStream IS = new FileInputStream("data/example_schema.n3");
|
||||||
|
schemaModel.read(IS, null, "N3");
|
||||||
|
|
||||||
|
Model dataModel = ModelFactory.createDefaultModel();
|
||||||
|
IS = new FileInputStream("data/example_data.n3");
|
||||||
|
dataModel.read(IS, null, "N3");
|
||||||
|
|
||||||
|
Model reasoningModel = ModelFactory.createRDFSModel(schemaModel, dataModel);
|
||||||
|
|
||||||
|
StmtIterator it = reasoningModel.listStatements();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Statement s = it.next();
|
||||||
|
System.out.println(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
Query q = QueryFactory.create("SELECT ?t WHERE {<http://example.org/Madrid> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?t .}" );
|
||||||
|
QueryExecution qexec = QueryExecutionFactory.create(q, reasoningModel);
|
||||||
|
ResultSet rs = qexec.execSelect();
|
||||||
|
while(rs.hasNext()) {
|
||||||
|
System.out.println(rs.next().get("t"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Binary file not shown.
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/.DS_Store
vendored
Normal file
BIN
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/.DS_Store
vendored
Normal file
Binary file not shown.
@ -0,0 +1,47 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<title></title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div align=center>
|
||||||
|
|
||||||
|
This Page is only a small Semantic Web Application which allows you to find information
|
||||||
|
about movies using "Linked Movie Data Base" and "Freebase".
|
||||||
|
</p>
|
||||||
|
In which Movie are you interested?</tab>
|
||||||
|
<form method="post" action="">
|
||||||
|
<input type="text" name="movieTitleByUser" size="45">
|
||||||
|
<input type="submit" name="buttonPressed" value="Search">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
include 'logic/controller.php';
|
||||||
|
|
||||||
|
if(isset($_POST['buttonPressed'])){
|
||||||
|
|
||||||
|
$movieTitleByUser =$_POST['movieTitleByUser'];
|
||||||
|
|
||||||
|
echo "</P>Getting Infos for: " . $movieTitleByUser;
|
||||||
|
|
||||||
|
echo '</br><progress value=$counter max="100">searching . . .</progress>';
|
||||||
|
|
||||||
|
$mainController = new controller();
|
||||||
|
$mainController->getData($movieTitleByUser);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<a href="http://www.linkedmdb.org/"><img src="logos/mdb.png" alt="linkedmdb.org"></a>
|
||||||
|
</br>
|
||||||
|
<a href="http://www.freebase.com/"><img src="logos/freebase.jpg" alt="freebase.com"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of controller
|
||||||
|
*
|
||||||
|
* @author Michael
|
||||||
|
*/
|
||||||
|
|
||||||
|
define("RDFAPI_INCLUDE_DIR", "rdfAPI/api/");
|
||||||
|
//static $RDFAPI_INCLUDE_DIR = 'rdfAPI/api/';
|
||||||
|
include RDFAPI_INCLUDE_DIR . 'RdfAPI.php';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class controller {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Funktion organisiert die verschiedenen Quellen und gibt diese
|
||||||
|
* an die View weiter.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getData($userInput){
|
||||||
|
|
||||||
|
$modelURI = "http://dpbedia.org/sparql";
|
||||||
|
$dbModell = ModelFactory::getDefaultDbModel($modelURI);
|
||||||
|
|
||||||
|
|
||||||
|
$querystring = "select ?label2 WHERE { ?country <http://dbpedia.org/ontology/capital> ?city . ?country <http://www.w3.org/2000/01/rdf-schema#label> ?label1 . ?city <http://www.w3.org/2000/01/rdf-schema#label> ?label2 . FILTER (str(?label1) = \"" . $userInput . "\" && LANG(?label2) = \"en\") ";
|
||||||
|
$result = $dbModell->sparqlQuery($querystring, 'xml');
|
||||||
|
|
||||||
|
echo $dbModell->sparqlQuery($querystring, 'xml');
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of freebaseController
|
||||||
|
*
|
||||||
|
* @author Michael
|
||||||
|
*/
|
||||||
|
class freebaseController {
|
||||||
|
//put your code here
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of mdbController
|
||||||
|
*
|
||||||
|
* @author Michael
|
||||||
|
*/
|
||||||
|
class mdbController {
|
||||||
|
//put your code here
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
copy.src.files=false
|
||||||
|
copy.src.target=
|
||||||
|
index.file=index.php
|
||||||
|
run.as=LOCAL
|
||||||
|
url=http://localhost/solution/
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
include.path=${php.global.include.path}
|
||||||
|
php.version=PHP_53
|
||||||
|
source.encoding=UTF-8
|
||||||
|
src.dir=.
|
||||||
|
tags.asp=false
|
||||||
|
tags.short=true
|
||||||
|
web.root=.
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.php.project</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/php-project/1">
|
||||||
|
<name>SemanticWebApp</name>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 49
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/556/trunk/rdfapi-php
|
||||||
|
END
|
||||||
46
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/rdfAPI/.svn/entries
Executable file
46
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/rdfAPI/.svn/entries
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
8
|
||||||
|
|
||||||
|
dir
|
||||||
|
556
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php/trunk/rdfapi-php
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-01-22T10:52:48.041272Z
|
||||||
|
556
|
||||||
|
fusel2k
|
||||||
|
|
||||||
|
|
||||||
|
svn:special svn:externals svn:needs-lock
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
b2ee660e-c932-0410-bdee-d8da4d8102f4
|
||||||
|
|
||||||
|
test
|
||||||
|
dir
|
||||||
|
|
||||||
|
netapi
|
||||||
|
dir
|
||||||
|
|
||||||
|
tools
|
||||||
|
dir
|
||||||
|
|
||||||
|
rap-pubby
|
||||||
|
dir
|
||||||
|
|
||||||
|
doc
|
||||||
|
dir
|
||||||
|
|
||||||
|
api
|
||||||
|
dir
|
||||||
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
8
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 53
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/556/trunk/rdfapi-php/api
|
||||||
|
END
|
||||||
|
constants.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 67
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/558/trunk/rdfapi-php/api/constants.php
|
||||||
|
END
|
||||||
|
RdfAPI.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 64
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/268/trunk/rdfapi-php/api/RdfAPI.php
|
||||||
|
END
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
8
|
||||||
|
|
||||||
|
dir
|
||||||
|
556
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php/trunk/rdfapi-php/api
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-01-22T10:52:48.041272Z
|
||||||
|
556
|
||||||
|
fusel2k
|
||||||
|
|
||||||
|
|
||||||
|
svn:special svn:externals svn:needs-lock
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
b2ee660e-c932-0410-bdee-d8da4d8102f4
|
||||||
|
|
||||||
|
model
|
||||||
|
dir
|
||||||
|
|
||||||
|
ontModel
|
||||||
|
dir
|
||||||
|
|
||||||
|
rdql
|
||||||
|
dir
|
||||||
|
|
||||||
|
sparql
|
||||||
|
dir
|
||||||
|
|
||||||
|
constants.php
|
||||||
|
file
|
||||||
|
558
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T15:14:07.085157Z
|
||||||
|
f305fb172543bc44201542efebec39a9
|
||||||
|
2008-02-29T15:14:04.958076Z
|
||||||
|
558
|
||||||
|
cax
|
||||||
|
has-props
|
||||||
|
|
||||||
|
dataset
|
||||||
|
dir
|
||||||
|
|
||||||
|
syntax
|
||||||
|
dir
|
||||||
|
|
||||||
|
vocabulary
|
||||||
|
dir
|
||||||
|
|
||||||
|
resModel
|
||||||
|
dir
|
||||||
|
|
||||||
|
RdfAPI.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:56.956719Z
|
||||||
|
3162507773a5651a21e2224bb9c957b5
|
||||||
|
2006-05-15T05:28:09.000000Z
|
||||||
|
268
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
infModel
|
||||||
|
dir
|
||||||
|
|
||||||
|
util
|
||||||
|
dir
|
||||||
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
8
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF API for PHP
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// @version : $Id$
|
||||||
|
// Authors : Chris Bizer (chris@bizer.de),
|
||||||
|
// Radoslaw Oldakowski (radol@gmx.de)
|
||||||
|
// Description : This file includes constatns and model package.
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Include Constants and base Object
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'constants.php' );
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'util/Object.php' );
|
||||||
|
include_once( RDFAPI_INCLUDE_DIR . PACKAGE_MODEL);
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,418 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Constants
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// @version : $Id$
|
||||||
|
// Authors : Chris Bizer (chris@bizer.de),
|
||||||
|
// Daniel Westphal (dawe@gmx.de),
|
||||||
|
// Leandro Mariano Lopez (llopez@xinergiaargentina.com),
|
||||||
|
// Radoslaw Oldakowski (radol@gmx.de)
|
||||||
|
//
|
||||||
|
// Description : Constants and default configuration
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// General
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDFAPI_ERROR', 'RDFAPI error ');
|
||||||
|
define('DEFAULT_ALGORITHM', 'MD5');
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
define('INDENTATION', ' ');
|
||||||
|
define('LINEFEED', chr(10));
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RAP Packages
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
define('PACKAGE_MODEL','model/ModelP.php');
|
||||||
|
define('PACKAGE_UTILITY','util/Utility.php');
|
||||||
|
define('PACKAGE_DBASE','model/DBase.php');
|
||||||
|
define('PACKAGE_SYNTAX_RDF','syntax/SyntaxRDF.php');
|
||||||
|
define('PACKAGE_SYNTAX_N3','syntax/SyntaxN3.php');
|
||||||
|
define('PACKAGE_SYNTAX_JSON','syntax/SyntaxJSON.php');
|
||||||
|
define('PACKAGE_SYNTAX_GRDDL','syntax/SyntaxGRDDL.php');
|
||||||
|
define('PACKAGE_VOCABULARY','vocabulary/Vocabulary.php');
|
||||||
|
define('PACKAGE_RDQL','rdql/RDQL.php');
|
||||||
|
define('PACKAGE_INFMODEL','infModel/InfModelP.php');
|
||||||
|
define('PACKAGE_RESMODEL','resModel/ResModelP.php');
|
||||||
|
define('PACKAGE_ONTMODEL','ontModel/OntModelP.php');
|
||||||
|
define('PACKAGE_DATASET','dataset/DatasetP.php');
|
||||||
|
define('PACKAGE_SPARQL','sparql/SPARQL.php');
|
||||||
|
define('PACKAGE_SYNTAX_RSS','syntax/SyntaxRSS.php');
|
||||||
|
define('PACKAGE_SYNTAX_SPARQLRES','syntax/SyntaxSparqlRes.php');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Model
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Defines a prefix used in the ID of automatically created bNodes.
|
||||||
|
define('BNODE_PREFIX', 'bNode');
|
||||||
|
|
||||||
|
// Sets the index of MemModell:
|
||||||
|
// IND_DEF: Defaultindex over subject, predicate, obeject seperate.
|
||||||
|
// IND_SPO: Index over subject+predicate+object.
|
||||||
|
// IND_SP: Index over subject+predicate.
|
||||||
|
// IND_SO: Index over subject+object.
|
||||||
|
define('NO_INDEX',-1);
|
||||||
|
define('IND_DEF',0);
|
||||||
|
define('IND_SPO',1);
|
||||||
|
define('IND_SP',2);
|
||||||
|
define('IND_SO',3);
|
||||||
|
define('INDEX_TYPE',IND_DEF);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// ModelFactory
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define ('MEMMODEL','MemModel');
|
||||||
|
define ('DBMODEL','DbModel');
|
||||||
|
define ('INFMODELF','InfModelF');
|
||||||
|
define ('INFMODELB','InfModelB');
|
||||||
|
define ('ONTMODEL','OntModel');
|
||||||
|
define ('RESMODEL','ResModel');
|
||||||
|
define ('RDFS_VOCABULARY','RdfsVocabulary.php');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Parser
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// RdfParser: Set this option to false if you want to use IDs containing CombiningChars or
|
||||||
|
// Extenders (see http://www.w3.org/TR/REC-xml-names/#NT-NCName). If set to TRUE, they're assumed to be invalid.
|
||||||
|
define('VALIDATE_IDS', TRUE);
|
||||||
|
|
||||||
|
// RdfParser: Set this option to true if you want to parse UNICODE documents.
|
||||||
|
// WARNING: Setting the option TRUE significantly slows down the RDF-parser.
|
||||||
|
define('UNIC_RDF', FALSE);
|
||||||
|
|
||||||
|
// RdfParser: Set this option to true if you want to make sure that the created RDF-model doesnt contain
|
||||||
|
// duplicate RDF-statements. WARNING: Setting the option TRUE significantly slows down the RDF-parser.
|
||||||
|
define('CREATE_MODEL_WITHOUT_DUPLICATES', FALSE);
|
||||||
|
|
||||||
|
// N3 and N-Triple-Parser: Set this option to true in order to override the given bnode
|
||||||
|
// labels and rename them to the defined BNODE_PREFIX
|
||||||
|
define('FIX_BLANKNODES', TRUE);
|
||||||
|
|
||||||
|
define('NAMESPACE_SEPARATOR_CHAR','^');
|
||||||
|
define('NAMESPACE_SEPARATOR_STRING','^');
|
||||||
|
define('IN_TOP_LEVEL',0);
|
||||||
|
define('IN_RDF',1);
|
||||||
|
define('IN_DESCRIPTION',2);
|
||||||
|
define('IN_PROPERTY_UNKNOWN_OBJECT',3);
|
||||||
|
define('IN_PROPERTY_RESOURCE',4);
|
||||||
|
define('IN_PROPERTY_EMPTY_RESOURCE',5);
|
||||||
|
define('IN_PROPERTY_LITERAL',6);
|
||||||
|
define('IN_PROPERTY_PARSE_TYPE_LITERAL',7);
|
||||||
|
define('IN_PROPERTY_PARSE_TYPE_RESOURCE',8);
|
||||||
|
define('IN_XML',9);
|
||||||
|
define('IN_UNKNOWN',10);
|
||||||
|
define('IN_PROPERTY_PARSE_TYPE_COLLECTION', 11);
|
||||||
|
define('RDF_SUBJECT_TYPE_URI',0);
|
||||||
|
define('RDF_SUBJECT_TYPE_DISTRIBUTED',1);
|
||||||
|
define('RDF_SUBJECT_TYPE_PREFIX',2);
|
||||||
|
define('RDF_SUBJECT_TYPE_ANONYMOUS',3);
|
||||||
|
define('RDF_SUBJECT_TYPE_BNODE',4);
|
||||||
|
define('RDF_OBJECT_TYPE_RESOURCE',0);
|
||||||
|
define('RDF_OBJECT_TYPE_LITERAL',1);
|
||||||
|
define('RDF_OBJECT_TYPE_XML',2);
|
||||||
|
define('RDF_OBJECT_TYPE_BNODE',3);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Serializer
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// RDF, N3, N-Triple Serializer: set to TRUE in oder to suppres the "Generated by RAP"
|
||||||
|
// comment in the output files.
|
||||||
|
define('HIDE_ADVERTISE',FALSE);
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should use entities for URIs.
|
||||||
|
define('SER_USE_ENTITIES', FALSE );
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should serialize triples as XML
|
||||||
|
// attributes where possible.
|
||||||
|
define('SER_USE_ATTRIBUTES', FALSE );
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE in order to sort the statements of a model before
|
||||||
|
// serializing them.
|
||||||
|
define('SER_SORT_MODEL', FALSE );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should use qualified names for RDF
|
||||||
|
// reserved words.
|
||||||
|
// NOTE: There is only one default namespace allowed within an XML document.
|
||||||
|
// Therefore if SER_RDF_QNAMES in is set to FALSE and you pass the parameter
|
||||||
|
// $xml_default_namespace to the method serialize() of class RdfSerializer,
|
||||||
|
// the model will be serialized as if SER_RDF_QNAMES were set to TRUE.
|
||||||
|
define('SER_RDF_QNAMES', TRUE );
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should start documents with the
|
||||||
|
// xml declaration <?xml version="1.0" encoding="UTF-8" >.
|
||||||
|
define('SER_XML_DECLARATION', TRUE );
|
||||||
|
|
||||||
|
// N3 Serializer: Set to TRUE, if the N3 serializer should try to compress the blank node
|
||||||
|
// syntax using [] whereever possible.
|
||||||
|
define('N3SER_BNODE_SHORT', FALSE);
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should write text values always as
|
||||||
|
// escaped CDATA.
|
||||||
|
define('USE_CDATA', FALSE);
|
||||||
|
|
||||||
|
define('USE_ANY_QUOTE', FALSE);
|
||||||
|
define('GENERAL_PREFIX_BASE','ns');
|
||||||
|
define('MAX_ALLOWED_ABBREVIATED_LENGTH',60);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Util
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Definition of the colors used by the method RDFUtil:writeHTMLTable
|
||||||
|
define('HTML_TABLE_HEADER_COLOR', '#FFFFFF');
|
||||||
|
define('HTML_TABLE_RESOURCE_COLOR', '#FFFFCC');
|
||||||
|
define('HTML_TABLE_LITERAL_COLOR', '#E7E7EF');
|
||||||
|
define('HTML_TABLE_BNODE_COLOR', '#FFCCFF');
|
||||||
|
define('HTML_TABLE_RDF_NS_COLOR', '#CCFFCC');
|
||||||
|
define('HTML_TABLE_NS_ROW_COLOR1', '#FFFFFF');
|
||||||
|
define('HTML_TABLE_NS_ROW_COLOR0', '#E7E7EF');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDF_NAMESPACE_URI','http://www.w3.org/1999/02/22-rdf-syntax-ns#' );
|
||||||
|
define('RDF_NAMESPACE_PREFIX','rdf' );
|
||||||
|
define('RDF_RDF','RDF');
|
||||||
|
define('RDF_DESCRIPTION','Description');
|
||||||
|
define('RDF_ID','ID');
|
||||||
|
define('RDF_ABOUT','about');
|
||||||
|
define('RDF_ABOUT_EACH','aboutEach');
|
||||||
|
define('RDF_ABOUT_EACH_PREFIX','aboutEachPrefix');
|
||||||
|
define('RDF_BAG_ID','bagID');
|
||||||
|
define('RDF_RESOURCE','resource');
|
||||||
|
define('RDF_VALUE','value');
|
||||||
|
define('RDF_PARSE_TYPE','parseType');
|
||||||
|
define('RDF_PARSE_TYPE_LITERAL','Literal');
|
||||||
|
define('RDF_PARSE_TYPE_RESOURCE','Resource');
|
||||||
|
define('RDF_PARSE_TYPE_COLLECTION', 'Collection');
|
||||||
|
define('RDF_TYPE','type');
|
||||||
|
define('RDF_BAG','Bag');
|
||||||
|
define('RDF_SEQ','Seq');
|
||||||
|
define('RDF_ALT','Alt');
|
||||||
|
define('RDF_LI','li');
|
||||||
|
define('RDF_STATEMENT','Statement');
|
||||||
|
define('RDF_SUBJECT','subject');
|
||||||
|
define('RDF_PREDICATE','predicate');
|
||||||
|
define('RDF_OBJECT','object');
|
||||||
|
define('RDF_NODEID','nodeID');
|
||||||
|
define('RDF_DATATYPE','datatype');
|
||||||
|
define('RDF_SEEALSO','seeAlso');
|
||||||
|
define('RDF_PROPERTY','Property');
|
||||||
|
define('RDF_LIST','List');
|
||||||
|
define('RDF_NIL','nil');
|
||||||
|
define('RDF_REST','rest');
|
||||||
|
define('RDF_FIRST','first');
|
||||||
|
define('RDF_XMLLITERAL', 'XMLLiteral');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF Schema
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDF_SCHEMA_URI','http://www.w3.org/2000/01/rdf-schema#' );
|
||||||
|
define('RDF_DATATYPE_SCHEMA_URI','http://www.w3.org/TR/xmlschema-2' );
|
||||||
|
define('RDF_SCHEMA_PREFIX', 'rdfs');
|
||||||
|
define('RDFS_SUBCLASSOF','subClassOf');
|
||||||
|
define('RDFS_SUBPROPERTYOF','subPropertyOf');
|
||||||
|
define('RDFS_RANGE','range');
|
||||||
|
define('RDFS_DOMAIN','domain');
|
||||||
|
define('RDFS_CLASS','Class');
|
||||||
|
define('RDFS_RESOURCE','Resource');
|
||||||
|
define('RDFS_DATATYPE','Datatype');
|
||||||
|
define('RDFS_LITERAL','Literal');
|
||||||
|
define('RDFS_SEE_ALSO','seeAlso');
|
||||||
|
define('RDFS_IS_DEFINED_BY','isDefinedBy');
|
||||||
|
define('RDFS_LABEL','label');
|
||||||
|
define('RDFS_COMMENT','comment');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// OWL
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('OWL_URI','http://www.w3.org/2002/07/owl#' );
|
||||||
|
define('OWL_PREFIX', 'owl');
|
||||||
|
define('OWL_SAME_AS','sameAs');
|
||||||
|
define('OWL_INVERSE_OF','inverseOf');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// XML
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('XML_NAMESPACE_PREFIX', 'xml');
|
||||||
|
define('XML_NAMESPACE_DECLARATION_PREFIX', 'xmlns');
|
||||||
|
define('XML_NAMESPACE_URI','http://www.w3.org/XML/1998/namespace' );
|
||||||
|
define('XML_LANG','lang');
|
||||||
|
define('DATATYPE_SHORTCUT_PREFIX','datatype:');
|
||||||
|
define('XML_SCHEMA','http://www.w3.org/2001/XMLSchema#');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF DATATYPE SHORTCUTS (extends datatype shortcuts to the full XML datatype URIs)
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$short_datatype = array(
|
||||||
|
'STRING' => RDF_DATATYPE_SCHEMA_URI . '#string',
|
||||||
|
'DECIMAL' => RDF_DATATYPE_SCHEMA_URI . '#decimal',
|
||||||
|
'INTEGER' => RDF_DATATYPE_SCHEMA_URI . '#integer',
|
||||||
|
'INT' => RDF_DATATYPE_SCHEMA_URI . '#int',
|
||||||
|
'SHORT' => RDF_DATATYPE_SCHEMA_URI . '#short',
|
||||||
|
'BYTE' => RDF_DATATYPE_SCHEMA_URI . '#byte',
|
||||||
|
'LONG' => RDF_DATATYPE_SCHEMA_URI . '#long',
|
||||||
|
'LANGUAGE' => RDF_DATATYPE_SCHEMA_URI . '#language',
|
||||||
|
'NAME' => RDF_DATATYPE_SCHEMA_URI . '#name'
|
||||||
|
);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Database
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!defined('ADODB_DB_DRIVER')) {
|
||||||
|
if (isset($GLOBALS['dbConf'])) {
|
||||||
|
define('ADODB_DB_DRIVER', $GLOBALS['dbConf']['type']);
|
||||||
|
define('ADODB_DB_HOST' , $GLOBALS['dbConf']['host']);
|
||||||
|
define('ADODB_DB_NAME' , $GLOBALS['dbConf']['database']);
|
||||||
|
define('ADODB_DB_USER' , $GLOBALS['dbConf']['user']);
|
||||||
|
define('ADODB_DB_PASSWORD', $GLOBALS['dbConf']['password']);
|
||||||
|
} else {
|
||||||
|
define('ADODB_DB_DRIVER', 'mysql');
|
||||||
|
define('ADODB_DB_HOST' , 'localhost');
|
||||||
|
define('ADODB_DB_NAME' , 'kbrdfdb');
|
||||||
|
define('ADODB_DB_USER' , 'kbrdf');
|
||||||
|
define('ADODB_DB_PASSWORD', 'db1');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined('ADODB_DEBUG_MODE')) {
|
||||||
|
define('ADODB_DEBUG_MODE', '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDQL Error Messages
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDQL_ERR','RDQL error ');
|
||||||
|
define('RDQL_SYN_ERR','RDQL syntax error ');
|
||||||
|
define('RDQL_SEL_ERR', RDQL_ERR .'in the SELECT clause: ');
|
||||||
|
define('RDQL_SRC_ERR', RDQL_ERR .'in the SOURCE clause: ');
|
||||||
|
define('RDQL_WHR_ERR', RDQL_ERR .'in the WHERE clause: ');
|
||||||
|
define('RDQL_AND_ERR', RDQL_ERR .'in the AND clause: ');
|
||||||
|
define('RDQL_USG_ERR', RDQL_ERR .'in the USING clause: ');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Vocabulary
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// namespace declarations
|
||||||
|
define('ATOM_NS' , 'http://purl.org/atom/ns#');
|
||||||
|
define('DC_NS' , 'http://purl.org/dc/elements/1.1/');
|
||||||
|
define('DCTERM_NS' , 'http://purl.org/dc/terms/');
|
||||||
|
define('DCMITYPE_NS', 'http://purl.org/dc/dcmitype/');
|
||||||
|
define('FOAF_NS' , 'http://xmlns.com/foaf/0.1/');
|
||||||
|
define('OWL_NS' , 'http://www.w3.org/2002/07/owl#');
|
||||||
|
define('RSS_NS' , 'http://purl.org/rss/1.0/');
|
||||||
|
define('VCARD_NS' , 'http://www.w3.org/2001/vcard-rdf/3.0#');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDQL, SPARQL and parser default namespace prefixes
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
global $default_prefixes;
|
||||||
|
$default_prefixes = array(
|
||||||
|
RDF_NAMESPACE_PREFIX => RDF_NAMESPACE_URI,
|
||||||
|
RDF_SCHEMA_PREFIX => RDF_SCHEMA_URI,
|
||||||
|
'xsd' => 'http://www.w3.org/2001/XMLSchema#',
|
||||||
|
OWL_PREFIX => OWL_URI,
|
||||||
|
'dc' => 'http://purl.org/dc/elements/1.1/',
|
||||||
|
'dcterms' => 'http://purl.org/dc/terms/',
|
||||||
|
'vcard' => 'http://www.w3.org/2001/vcard-rdf/3.0#'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// InfModel
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//activate / deactivate reasoning for the following schema constructs
|
||||||
|
//rdfs:subclass
|
||||||
|
define('INF_RES_SUBCLASSOF',true);
|
||||||
|
//rdfs:subproperty
|
||||||
|
define('INF_RES_SUBPROPERTYOF',true);
|
||||||
|
//rdfs:range
|
||||||
|
define('INF_RES_RANGE',true);
|
||||||
|
//rdfs:domain
|
||||||
|
define('INF_RES_DOMAIN',true);
|
||||||
|
//owl:sameAs
|
||||||
|
define('INF_RES_OWL_SAMEAS',true);
|
||||||
|
//owl:inverseOf
|
||||||
|
define('INF_RES_OWL_INVERSEOF',true);
|
||||||
|
|
||||||
|
//generic RDFS Rules from the RDF Schema doc:
|
||||||
|
//see: http://www.w3.org/TR/2004/REC-rdf-mt-20040210/#RDFSRules
|
||||||
|
define('INF_RES_RULE_RDFS12',false);
|
||||||
|
define('INF_RES_RULE_RDFS6',false);
|
||||||
|
define('INF_RES_RULE_RDFS8',false);
|
||||||
|
define('INF_RES_RULE_RDFS10',false);
|
||||||
|
define('INF_RES_RULE_RDFS13',false);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// GRAPHVIZ
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// path to the dot binary
|
||||||
|
define('GRAPHVIZ_PATH', 'C:\/Programme\/ATT\/Graphviz\/bin\/dot.exe');
|
||||||
|
|
||||||
|
// directory for temporary files
|
||||||
|
// Attention: must be write-/readable by the webserver
|
||||||
|
define('GRAPHVIZ_TEMP', 'C:\/');
|
||||||
|
|
||||||
|
// display statistical data in generated images
|
||||||
|
// currently only number of statements drawn
|
||||||
|
define('GRAPHVIZ_STAT', TRUE);
|
||||||
|
|
||||||
|
// allowed file formats
|
||||||
|
// for security reasons (to prevent code injection)
|
||||||
|
define('GRAPHVIZ_FORMAT', 'svg, dot, jpg, png, gif, vrml');
|
||||||
|
|
||||||
|
// enable clickable URIs
|
||||||
|
// only supported by certain formats (e.g. SVG)
|
||||||
|
define('GRAPHVIZ_URI', FALSE);
|
||||||
|
|
||||||
|
// define parameters for the graphical output
|
||||||
|
// if a paramter is undefined, the default value of graphviz is used
|
||||||
|
// for further information see: http://www.graphviz.org/Documentation.php
|
||||||
|
$graphviz_param = array(
|
||||||
|
'GRAPH_STYLE' => 'rankdir="TB"',
|
||||||
|
'RESOURCE_STYLE' => 'style="filled",color="#FFD800",fontname="Courier",fontsize="10"',
|
||||||
|
'LITERAL_STYLE' => 'shape="box",style="filled",color="#B7FFAF",fontname="Courier",fontsize="10"',
|
||||||
|
'PREDICATE_STYLE' => 'fontname="Courier",fontsize="10"',
|
||||||
|
'INFERRED_STYLE' => 'style="dotted",fontname="Courier",fontsize="10"',
|
||||||
|
'BLANKNODE_STYLE' => 'style="filled",color="#DDDDDD",fontname="Courier",fontsize="10"',
|
||||||
|
'BOX_STYLE' => 'fontname="Courier",fontsize="8",color="#BBBBBB"'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// SPARQL
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Attribute lists for describing Resources. ['resource type'] = array(att1, att2, att3, ...).
|
||||||
|
//
|
||||||
|
|
||||||
|
$sparql_describe = array(
|
||||||
|
FOAF_NS.'person' => array(FOAF_NS.'name',FOAF_NS.'homepage',FOAF_NS.'mbox')
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
21
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/rdfAPI/api/RdfAPI.php
Executable file
21
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/rdfAPI/api/RdfAPI.php
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF API for PHP
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// @version : $Id: RdfAPI.php 268 2006-05-15 05:28:09Z tgauss $
|
||||||
|
// Authors : Chris Bizer (chris@bizer.de),
|
||||||
|
// Radoslaw Oldakowski (radol@gmx.de)
|
||||||
|
// Description : This file includes constatns and model package.
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Include Constants and base Object
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'constants.php' );
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'util/Object.php' );
|
||||||
|
include_once( RDFAPI_INCLUDE_DIR . PACKAGE_MODEL);
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
418
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/rdfAPI/api/constants.php
Executable file
418
ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/solution/rdfAPI/api/constants.php
Executable file
@ -0,0 +1,418 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Constants
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// @version : $Id: constants.php 558 2008-02-29 15:14:04Z cax $
|
||||||
|
// Authors : Chris Bizer (chris@bizer.de),
|
||||||
|
// Daniel Westphal (dawe@gmx.de),
|
||||||
|
// Leandro Mariano Lopez (llopez@xinergiaargentina.com),
|
||||||
|
// Radoslaw Oldakowski (radol@gmx.de)
|
||||||
|
//
|
||||||
|
// Description : Constants and default configuration
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// General
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDFAPI_ERROR', 'RDFAPI error ');
|
||||||
|
define('DEFAULT_ALGORITHM', 'MD5');
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
define('INDENTATION', ' ');
|
||||||
|
define('LINEFEED', chr(10));
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RAP Packages
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
define('PACKAGE_MODEL','model/ModelP.php');
|
||||||
|
define('PACKAGE_UTILITY','util/Utility.php');
|
||||||
|
define('PACKAGE_DBASE','model/DBase.php');
|
||||||
|
define('PACKAGE_SYNTAX_RDF','syntax/SyntaxRDF.php');
|
||||||
|
define('PACKAGE_SYNTAX_N3','syntax/SyntaxN3.php');
|
||||||
|
define('PACKAGE_SYNTAX_JSON','syntax/SyntaxJSON.php');
|
||||||
|
define('PACKAGE_SYNTAX_GRDDL','syntax/SyntaxGRDDL.php');
|
||||||
|
define('PACKAGE_VOCABULARY','vocabulary/Vocabulary.php');
|
||||||
|
define('PACKAGE_RDQL','rdql/RDQL.php');
|
||||||
|
define('PACKAGE_INFMODEL','infModel/InfModelP.php');
|
||||||
|
define('PACKAGE_RESMODEL','resModel/ResModelP.php');
|
||||||
|
define('PACKAGE_ONTMODEL','ontModel/OntModelP.php');
|
||||||
|
define('PACKAGE_DATASET','dataset/DatasetP.php');
|
||||||
|
define('PACKAGE_SPARQL','sparql/SPARQL.php');
|
||||||
|
define('PACKAGE_SYNTAX_RSS','syntax/SyntaxRSS.php');
|
||||||
|
define('PACKAGE_SYNTAX_SPARQLRES','syntax/SyntaxSparqlRes.php');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Model
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Defines a prefix used in the ID of automatically created bNodes.
|
||||||
|
define('BNODE_PREFIX', 'bNode');
|
||||||
|
|
||||||
|
// Sets the index of MemModell:
|
||||||
|
// IND_DEF: Defaultindex over subject, predicate, obeject seperate.
|
||||||
|
// IND_SPO: Index over subject+predicate+object.
|
||||||
|
// IND_SP: Index over subject+predicate.
|
||||||
|
// IND_SO: Index over subject+object.
|
||||||
|
define('NO_INDEX',-1);
|
||||||
|
define('IND_DEF',0);
|
||||||
|
define('IND_SPO',1);
|
||||||
|
define('IND_SP',2);
|
||||||
|
define('IND_SO',3);
|
||||||
|
define('INDEX_TYPE',IND_DEF);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// ModelFactory
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define ('MEMMODEL','MemModel');
|
||||||
|
define ('DBMODEL','DbModel');
|
||||||
|
define ('INFMODELF','InfModelF');
|
||||||
|
define ('INFMODELB','InfModelB');
|
||||||
|
define ('ONTMODEL','OntModel');
|
||||||
|
define ('RESMODEL','ResModel');
|
||||||
|
define ('RDFS_VOCABULARY','RdfsVocabulary.php');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Parser
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// RdfParser: Set this option to false if you want to use IDs containing CombiningChars or
|
||||||
|
// Extenders (see http://www.w3.org/TR/REC-xml-names/#NT-NCName). If set to TRUE, they're assumed to be invalid.
|
||||||
|
define('VALIDATE_IDS', TRUE);
|
||||||
|
|
||||||
|
// RdfParser: Set this option to true if you want to parse UNICODE documents.
|
||||||
|
// WARNING: Setting the option TRUE significantly slows down the RDF-parser.
|
||||||
|
define('UNIC_RDF', FALSE);
|
||||||
|
|
||||||
|
// RdfParser: Set this option to true if you want to make sure that the created RDF-model doesnt contain
|
||||||
|
// duplicate RDF-statements. WARNING: Setting the option TRUE significantly slows down the RDF-parser.
|
||||||
|
define('CREATE_MODEL_WITHOUT_DUPLICATES', FALSE);
|
||||||
|
|
||||||
|
// N3 and N-Triple-Parser: Set this option to true in order to override the given bnode
|
||||||
|
// labels and rename them to the defined BNODE_PREFIX
|
||||||
|
define('FIX_BLANKNODES', TRUE);
|
||||||
|
|
||||||
|
define('NAMESPACE_SEPARATOR_CHAR','^');
|
||||||
|
define('NAMESPACE_SEPARATOR_STRING','^');
|
||||||
|
define('IN_TOP_LEVEL',0);
|
||||||
|
define('IN_RDF',1);
|
||||||
|
define('IN_DESCRIPTION',2);
|
||||||
|
define('IN_PROPERTY_UNKNOWN_OBJECT',3);
|
||||||
|
define('IN_PROPERTY_RESOURCE',4);
|
||||||
|
define('IN_PROPERTY_EMPTY_RESOURCE',5);
|
||||||
|
define('IN_PROPERTY_LITERAL',6);
|
||||||
|
define('IN_PROPERTY_PARSE_TYPE_LITERAL',7);
|
||||||
|
define('IN_PROPERTY_PARSE_TYPE_RESOURCE',8);
|
||||||
|
define('IN_XML',9);
|
||||||
|
define('IN_UNKNOWN',10);
|
||||||
|
define('IN_PROPERTY_PARSE_TYPE_COLLECTION', 11);
|
||||||
|
define('RDF_SUBJECT_TYPE_URI',0);
|
||||||
|
define('RDF_SUBJECT_TYPE_DISTRIBUTED',1);
|
||||||
|
define('RDF_SUBJECT_TYPE_PREFIX',2);
|
||||||
|
define('RDF_SUBJECT_TYPE_ANONYMOUS',3);
|
||||||
|
define('RDF_SUBJECT_TYPE_BNODE',4);
|
||||||
|
define('RDF_OBJECT_TYPE_RESOURCE',0);
|
||||||
|
define('RDF_OBJECT_TYPE_LITERAL',1);
|
||||||
|
define('RDF_OBJECT_TYPE_XML',2);
|
||||||
|
define('RDF_OBJECT_TYPE_BNODE',3);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Serializer
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// RDF, N3, N-Triple Serializer: set to TRUE in oder to suppres the "Generated by RAP"
|
||||||
|
// comment in the output files.
|
||||||
|
define('HIDE_ADVERTISE',FALSE);
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should use entities for URIs.
|
||||||
|
define('SER_USE_ENTITIES', FALSE );
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should serialize triples as XML
|
||||||
|
// attributes where possible.
|
||||||
|
define('SER_USE_ATTRIBUTES', FALSE );
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE in order to sort the statements of a model before
|
||||||
|
// serializing them.
|
||||||
|
define('SER_SORT_MODEL', FALSE );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should use qualified names for RDF
|
||||||
|
// reserved words.
|
||||||
|
// NOTE: There is only one default namespace allowed within an XML document.
|
||||||
|
// Therefore if SER_RDF_QNAMES in is set to FALSE and you pass the parameter
|
||||||
|
// $xml_default_namespace to the method serialize() of class RdfSerializer,
|
||||||
|
// the model will be serialized as if SER_RDF_QNAMES were set to TRUE.
|
||||||
|
define('SER_RDF_QNAMES', TRUE );
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should start documents with the
|
||||||
|
// xml declaration <?xml version="1.0" encoding="UTF-8" >.
|
||||||
|
define('SER_XML_DECLARATION', TRUE );
|
||||||
|
|
||||||
|
// N3 Serializer: Set to TRUE, if the N3 serializer should try to compress the blank node
|
||||||
|
// syntax using [] whereever possible.
|
||||||
|
define('N3SER_BNODE_SHORT', FALSE);
|
||||||
|
|
||||||
|
// RDF Serializer: Set to TRUE, if the serializer should write text values always as
|
||||||
|
// escaped CDATA.
|
||||||
|
define('USE_CDATA', FALSE);
|
||||||
|
|
||||||
|
define('USE_ANY_QUOTE', FALSE);
|
||||||
|
define('GENERAL_PREFIX_BASE','ns');
|
||||||
|
define('MAX_ALLOWED_ABBREVIATED_LENGTH',60);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Util
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Definition of the colors used by the method RDFUtil:writeHTMLTable
|
||||||
|
define('HTML_TABLE_HEADER_COLOR', '#FFFFFF');
|
||||||
|
define('HTML_TABLE_RESOURCE_COLOR', '#FFFFCC');
|
||||||
|
define('HTML_TABLE_LITERAL_COLOR', '#E7E7EF');
|
||||||
|
define('HTML_TABLE_BNODE_COLOR', '#FFCCFF');
|
||||||
|
define('HTML_TABLE_RDF_NS_COLOR', '#CCFFCC');
|
||||||
|
define('HTML_TABLE_NS_ROW_COLOR1', '#FFFFFF');
|
||||||
|
define('HTML_TABLE_NS_ROW_COLOR0', '#E7E7EF');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDF_NAMESPACE_URI','http://www.w3.org/1999/02/22-rdf-syntax-ns#' );
|
||||||
|
define('RDF_NAMESPACE_PREFIX','rdf' );
|
||||||
|
define('RDF_RDF','RDF');
|
||||||
|
define('RDF_DESCRIPTION','Description');
|
||||||
|
define('RDF_ID','ID');
|
||||||
|
define('RDF_ABOUT','about');
|
||||||
|
define('RDF_ABOUT_EACH','aboutEach');
|
||||||
|
define('RDF_ABOUT_EACH_PREFIX','aboutEachPrefix');
|
||||||
|
define('RDF_BAG_ID','bagID');
|
||||||
|
define('RDF_RESOURCE','resource');
|
||||||
|
define('RDF_VALUE','value');
|
||||||
|
define('RDF_PARSE_TYPE','parseType');
|
||||||
|
define('RDF_PARSE_TYPE_LITERAL','Literal');
|
||||||
|
define('RDF_PARSE_TYPE_RESOURCE','Resource');
|
||||||
|
define('RDF_PARSE_TYPE_COLLECTION', 'Collection');
|
||||||
|
define('RDF_TYPE','type');
|
||||||
|
define('RDF_BAG','Bag');
|
||||||
|
define('RDF_SEQ','Seq');
|
||||||
|
define('RDF_ALT','Alt');
|
||||||
|
define('RDF_LI','li');
|
||||||
|
define('RDF_STATEMENT','Statement');
|
||||||
|
define('RDF_SUBJECT','subject');
|
||||||
|
define('RDF_PREDICATE','predicate');
|
||||||
|
define('RDF_OBJECT','object');
|
||||||
|
define('RDF_NODEID','nodeID');
|
||||||
|
define('RDF_DATATYPE','datatype');
|
||||||
|
define('RDF_SEEALSO','seeAlso');
|
||||||
|
define('RDF_PROPERTY','Property');
|
||||||
|
define('RDF_LIST','List');
|
||||||
|
define('RDF_NIL','nil');
|
||||||
|
define('RDF_REST','rest');
|
||||||
|
define('RDF_FIRST','first');
|
||||||
|
define('RDF_XMLLITERAL', 'XMLLiteral');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF Schema
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDF_SCHEMA_URI','http://www.w3.org/2000/01/rdf-schema#' );
|
||||||
|
define('RDF_DATATYPE_SCHEMA_URI','http://www.w3.org/TR/xmlschema-2' );
|
||||||
|
define('RDF_SCHEMA_PREFIX', 'rdfs');
|
||||||
|
define('RDFS_SUBCLASSOF','subClassOf');
|
||||||
|
define('RDFS_SUBPROPERTYOF','subPropertyOf');
|
||||||
|
define('RDFS_RANGE','range');
|
||||||
|
define('RDFS_DOMAIN','domain');
|
||||||
|
define('RDFS_CLASS','Class');
|
||||||
|
define('RDFS_RESOURCE','Resource');
|
||||||
|
define('RDFS_DATATYPE','Datatype');
|
||||||
|
define('RDFS_LITERAL','Literal');
|
||||||
|
define('RDFS_SEE_ALSO','seeAlso');
|
||||||
|
define('RDFS_IS_DEFINED_BY','isDefinedBy');
|
||||||
|
define('RDFS_LABEL','label');
|
||||||
|
define('RDFS_COMMENT','comment');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// OWL
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('OWL_URI','http://www.w3.org/2002/07/owl#' );
|
||||||
|
define('OWL_PREFIX', 'owl');
|
||||||
|
define('OWL_SAME_AS','sameAs');
|
||||||
|
define('OWL_INVERSE_OF','inverseOf');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// XML
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('XML_NAMESPACE_PREFIX', 'xml');
|
||||||
|
define('XML_NAMESPACE_DECLARATION_PREFIX', 'xmlns');
|
||||||
|
define('XML_NAMESPACE_URI','http://www.w3.org/XML/1998/namespace' );
|
||||||
|
define('XML_LANG','lang');
|
||||||
|
define('DATATYPE_SHORTCUT_PREFIX','datatype:');
|
||||||
|
define('XML_SCHEMA','http://www.w3.org/2001/XMLSchema#');
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDF DATATYPE SHORTCUTS (extends datatype shortcuts to the full XML datatype URIs)
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$short_datatype = array(
|
||||||
|
'STRING' => RDF_DATATYPE_SCHEMA_URI . '#string',
|
||||||
|
'DECIMAL' => RDF_DATATYPE_SCHEMA_URI . '#decimal',
|
||||||
|
'INTEGER' => RDF_DATATYPE_SCHEMA_URI . '#integer',
|
||||||
|
'INT' => RDF_DATATYPE_SCHEMA_URI . '#int',
|
||||||
|
'SHORT' => RDF_DATATYPE_SCHEMA_URI . '#short',
|
||||||
|
'BYTE' => RDF_DATATYPE_SCHEMA_URI . '#byte',
|
||||||
|
'LONG' => RDF_DATATYPE_SCHEMA_URI . '#long',
|
||||||
|
'LANGUAGE' => RDF_DATATYPE_SCHEMA_URI . '#language',
|
||||||
|
'NAME' => RDF_DATATYPE_SCHEMA_URI . '#name'
|
||||||
|
);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Database
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!defined('ADODB_DB_DRIVER')) {
|
||||||
|
if (isset($GLOBALS['dbConf'])) {
|
||||||
|
define('ADODB_DB_DRIVER', $GLOBALS['dbConf']['type']);
|
||||||
|
define('ADODB_DB_HOST' , $GLOBALS['dbConf']['host']);
|
||||||
|
define('ADODB_DB_NAME' , $GLOBALS['dbConf']['database']);
|
||||||
|
define('ADODB_DB_USER' , $GLOBALS['dbConf']['user']);
|
||||||
|
define('ADODB_DB_PASSWORD', $GLOBALS['dbConf']['password']);
|
||||||
|
} else {
|
||||||
|
define('ADODB_DB_DRIVER', 'mysql');
|
||||||
|
define('ADODB_DB_HOST' , 'localhost');
|
||||||
|
define('ADODB_DB_NAME' , 'kbrdfdb');
|
||||||
|
define('ADODB_DB_USER' , 'kbrdf');
|
||||||
|
define('ADODB_DB_PASSWORD', 'db1');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined('ADODB_DEBUG_MODE')) {
|
||||||
|
define('ADODB_DEBUG_MODE', '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDQL Error Messages
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
define('RDQL_ERR','RDQL error ');
|
||||||
|
define('RDQL_SYN_ERR','RDQL syntax error ');
|
||||||
|
define('RDQL_SEL_ERR', RDQL_ERR .'in the SELECT clause: ');
|
||||||
|
define('RDQL_SRC_ERR', RDQL_ERR .'in the SOURCE clause: ');
|
||||||
|
define('RDQL_WHR_ERR', RDQL_ERR .'in the WHERE clause: ');
|
||||||
|
define('RDQL_AND_ERR', RDQL_ERR .'in the AND clause: ');
|
||||||
|
define('RDQL_USG_ERR', RDQL_ERR .'in the USING clause: ');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Vocabulary
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// namespace declarations
|
||||||
|
define('ATOM_NS' , 'http://purl.org/atom/ns#');
|
||||||
|
define('DC_NS' , 'http://purl.org/dc/elements/1.1/');
|
||||||
|
define('DCTERM_NS' , 'http://purl.org/dc/terms/');
|
||||||
|
define('DCMITYPE_NS', 'http://purl.org/dc/dcmitype/');
|
||||||
|
define('FOAF_NS' , 'http://xmlns.com/foaf/0.1/');
|
||||||
|
define('OWL_NS' , 'http://www.w3.org/2002/07/owl#');
|
||||||
|
define('RSS_NS' , 'http://purl.org/rss/1.0/');
|
||||||
|
define('VCARD_NS' , 'http://www.w3.org/2001/vcard-rdf/3.0#');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// RDQL, SPARQL and parser default namespace prefixes
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
global $default_prefixes;
|
||||||
|
$default_prefixes = array(
|
||||||
|
RDF_NAMESPACE_PREFIX => RDF_NAMESPACE_URI,
|
||||||
|
RDF_SCHEMA_PREFIX => RDF_SCHEMA_URI,
|
||||||
|
'xsd' => 'http://www.w3.org/2001/XMLSchema#',
|
||||||
|
OWL_PREFIX => OWL_URI,
|
||||||
|
'dc' => 'http://purl.org/dc/elements/1.1/',
|
||||||
|
'dcterms' => 'http://purl.org/dc/terms/',
|
||||||
|
'vcard' => 'http://www.w3.org/2001/vcard-rdf/3.0#'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// InfModel
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//activate / deactivate reasoning for the following schema constructs
|
||||||
|
//rdfs:subclass
|
||||||
|
define('INF_RES_SUBCLASSOF',true);
|
||||||
|
//rdfs:subproperty
|
||||||
|
define('INF_RES_SUBPROPERTYOF',true);
|
||||||
|
//rdfs:range
|
||||||
|
define('INF_RES_RANGE',true);
|
||||||
|
//rdfs:domain
|
||||||
|
define('INF_RES_DOMAIN',true);
|
||||||
|
//owl:sameAs
|
||||||
|
define('INF_RES_OWL_SAMEAS',true);
|
||||||
|
//owl:inverseOf
|
||||||
|
define('INF_RES_OWL_INVERSEOF',true);
|
||||||
|
|
||||||
|
//generic RDFS Rules from the RDF Schema doc:
|
||||||
|
//see: http://www.w3.org/TR/2004/REC-rdf-mt-20040210/#RDFSRules
|
||||||
|
define('INF_RES_RULE_RDFS12',false);
|
||||||
|
define('INF_RES_RULE_RDFS6',false);
|
||||||
|
define('INF_RES_RULE_RDFS8',false);
|
||||||
|
define('INF_RES_RULE_RDFS10',false);
|
||||||
|
define('INF_RES_RULE_RDFS13',false);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// GRAPHVIZ
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// path to the dot binary
|
||||||
|
define('GRAPHVIZ_PATH', 'C:\/Programme\/ATT\/Graphviz\/bin\/dot.exe');
|
||||||
|
|
||||||
|
// directory for temporary files
|
||||||
|
// Attention: must be write-/readable by the webserver
|
||||||
|
define('GRAPHVIZ_TEMP', 'C:\/');
|
||||||
|
|
||||||
|
// display statistical data in generated images
|
||||||
|
// currently only number of statements drawn
|
||||||
|
define('GRAPHVIZ_STAT', TRUE);
|
||||||
|
|
||||||
|
// allowed file formats
|
||||||
|
// for security reasons (to prevent code injection)
|
||||||
|
define('GRAPHVIZ_FORMAT', 'svg, dot, jpg, png, gif, vrml');
|
||||||
|
|
||||||
|
// enable clickable URIs
|
||||||
|
// only supported by certain formats (e.g. SVG)
|
||||||
|
define('GRAPHVIZ_URI', FALSE);
|
||||||
|
|
||||||
|
// define parameters for the graphical output
|
||||||
|
// if a paramter is undefined, the default value of graphviz is used
|
||||||
|
// for further information see: http://www.graphviz.org/Documentation.php
|
||||||
|
$graphviz_param = array(
|
||||||
|
'GRAPH_STYLE' => 'rankdir="TB"',
|
||||||
|
'RESOURCE_STYLE' => 'style="filled",color="#FFD800",fontname="Courier",fontsize="10"',
|
||||||
|
'LITERAL_STYLE' => 'shape="box",style="filled",color="#B7FFAF",fontname="Courier",fontsize="10"',
|
||||||
|
'PREDICATE_STYLE' => 'fontname="Courier",fontsize="10"',
|
||||||
|
'INFERRED_STYLE' => 'style="dotted",fontname="Courier",fontsize="10"',
|
||||||
|
'BLANKNODE_STYLE' => 'style="filled",color="#DDDDDD",fontname="Courier",fontsize="10"',
|
||||||
|
'BOX_STYLE' => 'fontname="Courier",fontsize="8",color="#BBBBBB"'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// SPARQL
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Attribute lists for describing Resources. ['resource type'] = array(att1, att2, att3, ...).
|
||||||
|
//
|
||||||
|
|
||||||
|
$sparql_describe = array(
|
||||||
|
FOAF_NS.'person' => array(FOAF_NS.'name',FOAF_NS.'homepage',FOAF_NS.'mbox')
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 61
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/486/trunk/rdfapi-php/api/dataset
|
||||||
|
END
|
||||||
|
Quad.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 70
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/dataset/Quad.php
|
||||||
|
END
|
||||||
|
DatasetDb.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 75
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/486/trunk/rdfapi-php/api/dataset/DatasetDb.php
|
||||||
|
END
|
||||||
|
NamedGraphDb.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 78
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/dataset/NamedGraphDb.php
|
||||||
|
END
|
||||||
|
IteratorAllGraphsDb.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 85
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/268/trunk/rdfapi-php/api/dataset/IteratorAllGraphsDb.php
|
||||||
|
END
|
||||||
|
IteratorFindQuadsDb.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 85
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/dataset/IteratorFindQuadsDb.php
|
||||||
|
END
|
||||||
|
DatasetMem.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 76
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/432/trunk/rdfapi-php/api/dataset/DatasetMem.php
|
||||||
|
END
|
||||||
|
Dataset.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 73
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/344/trunk/rdfapi-php/api/dataset/Dataset.php
|
||||||
|
END
|
||||||
|
DatasetP.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 74
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/340/trunk/rdfapi-php/api/dataset/DatasetP.php
|
||||||
|
END
|
||||||
|
NamedGraphMem.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 79
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/425/trunk/rdfapi-php/api/dataset/NamedGraphMem.php
|
||||||
|
END
|
||||||
|
IteratorAllGraphsMem.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 86
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/dataset/IteratorAllGraphsMem.php
|
||||||
|
END
|
||||||
|
IteratorFindQuadsMem.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 86
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/432/trunk/rdfapi-php/api/dataset/IteratorFindQuadsMem.php
|
||||||
|
END
|
||||||
@ -0,0 +1,171 @@
|
|||||||
|
8
|
||||||
|
|
||||||
|
dir
|
||||||
|
556
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php/trunk/rdfapi-php/api/dataset
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2007-08-12T11:59:54.054541Z
|
||||||
|
486
|
||||||
|
cweiske
|
||||||
|
|
||||||
|
|
||||||
|
svn:special svn:externals svn:needs-lock
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
b2ee660e-c932-0410-bdee-d8da4d8102f4
|
||||||
|
|
||||||
|
Quad.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.506256Z
|
||||||
|
82f6dad7f83ff7bd38e727dc9fa21e40
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
DatasetDb.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.521877Z
|
||||||
|
b8eb44f5819b99805c42748686f4577d
|
||||||
|
2007-08-12T11:59:54.054541Z
|
||||||
|
486
|
||||||
|
cweiske
|
||||||
|
has-props
|
||||||
|
|
||||||
|
NamedGraphDb.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.521877Z
|
||||||
|
56e8ddd0d8aa0251664cda4114355b8c
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
IteratorAllGraphsDb.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.537498Z
|
||||||
|
59240fdfee65743297fc65a81f1f6f5a
|
||||||
|
2006-05-15T05:28:09.000000Z
|
||||||
|
268
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
IteratorFindQuadsDb.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.537498Z
|
||||||
|
ad64d93ddc73d832608fcbd14dd35e21
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
DatasetMem.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.553118Z
|
||||||
|
d396a0892728aa6223f01b1aecc96133
|
||||||
|
2007-05-01T15:58:57.000000Z
|
||||||
|
432
|
||||||
|
cweiske
|
||||||
|
has-props
|
||||||
|
|
||||||
|
Dataset.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.553118Z
|
||||||
|
bf5304281853bf6676c4b6dc082700fe
|
||||||
|
2007-02-07T08:24:32.000000Z
|
||||||
|
344
|
||||||
|
cweiske
|
||||||
|
has-props
|
||||||
|
|
||||||
|
DatasetP.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.568739Z
|
||||||
|
ca230297a71d4eaa77755fdacbee0704
|
||||||
|
2007-01-23T12:20:51.000000Z
|
||||||
|
340
|
||||||
|
cweiske
|
||||||
|
has-props
|
||||||
|
|
||||||
|
NamedGraphMem.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.568739Z
|
||||||
|
c74e213a48c35e2a8d3301edd5ad8ded
|
||||||
|
2007-05-01T12:59:18.000000Z
|
||||||
|
425
|
||||||
|
cweiske
|
||||||
|
has-props
|
||||||
|
|
||||||
|
IteratorAllGraphsMem.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.584359Z
|
||||||
|
f8e8a5f81b38bc833b72c24e7f23237a
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
IteratorFindQuadsMem.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:47.584359Z
|
||||||
|
705c6e4de4b5bc4c05baffb10a77e02e
|
||||||
|
2007-05-01T15:58:57.000000Z
|
||||||
|
432
|
||||||
|
cweiske
|
||||||
|
has-props
|
||||||
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
8
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
END
|
||||||
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: Dataset
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dataset implementation.
|
||||||
|
* Superclass of datasetMem and datasetDb which contains shared functionality.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
* @author Chris Bizer <chris@bizer.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class Dataset
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Load a Dataset from a File
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function loadFromFile($file)
|
||||||
|
{
|
||||||
|
$parser= new TriXParser($this);
|
||||||
|
$parser->parseFile($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a Datset from a string
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function loadFromString($string)
|
||||||
|
{
|
||||||
|
$parser= new TriXParser($this);
|
||||||
|
$parser->parseString($string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize the Dataset to File
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function serializeToFile($fileName)
|
||||||
|
{
|
||||||
|
$serializer= new TriXSerializer($this);
|
||||||
|
$serializer->serializeToFile($fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize the Dataset to string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function serializeToString()
|
||||||
|
{
|
||||||
|
$serializer= new TriXSerializer($this);
|
||||||
|
return $serializer->serializeToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs a SPARQL query against an RDF Dataset.
|
||||||
|
* The result can be retrived in SPARQL Query Results XML Format or
|
||||||
|
* as an array containing the variables an their bindings.
|
||||||
|
*
|
||||||
|
* @param String $query the sparql query string
|
||||||
|
* @param String $resultform the result form ('xml' for SPARQL Query Results XML Format)
|
||||||
|
* @return String/array
|
||||||
|
*/
|
||||||
|
function sparqlQuery($query,$resultform = false){
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_SPARQL);
|
||||||
|
$parser = new SparqlParser();
|
||||||
|
$q = $parser->parse($query);
|
||||||
|
|
||||||
|
$eng = SparqlEngine::factory();
|
||||||
|
return $eng->queryModel($this,$q,$resultform);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,451 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'model/DbModel.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsDb.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: DatasetDb
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent implementation of a Dataset in a database.
|
||||||
|
* A RDF dataset is a collection of named RDF graphs.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
* @author Chris Bizer <chris@bizer.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
require_once(RDFAPI_INCLUDE_DIR.PACKAGE_DBASE);
|
||||||
|
|
||||||
|
class DatasetDb extends Dataset
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to databse connection.
|
||||||
|
*
|
||||||
|
* @var resource dbConnection
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbConnection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to the dbStore Object.
|
||||||
|
*
|
||||||
|
* @var $dbStore dbStore
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbStore;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the Dataset
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $setName;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a Dataset name.
|
||||||
|
*
|
||||||
|
* @param ADODBConnection
|
||||||
|
* @param DbStore
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function DatasetDb(&$dbConnection,&$dbStore,$datasetName)
|
||||||
|
{
|
||||||
|
$this->dbConnection=& $dbConnection;
|
||||||
|
$this->dbStore=&$dbStore;
|
||||||
|
$this->setName= $datasetName;
|
||||||
|
$this->_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize
|
||||||
|
* Read all needed data into the set.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _initialize()
|
||||||
|
{
|
||||||
|
$recordSet =& $this->dbConnection->execute("SELECT defaultModelUri
|
||||||
|
FROM datasets where datasetName='".$this->setName."'");
|
||||||
|
|
||||||
|
$this->defaultGraph=& $this->dbStore->getModel($recordSet->fields[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// === Graph level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the Dataset name. Return true on success, false otherwise.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setDatasetName($datasetName)
|
||||||
|
{
|
||||||
|
if ($this->dbStore->datasetExists($datasetName))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->dbConnection->execute("UPDATE datasets SET datasetName='".$datasetName."'
|
||||||
|
where datasetName='".$this->setName."'");
|
||||||
|
|
||||||
|
$this->dbConnection->execute("UPDATE dataset_model SET datasetName='".$datasetName."'
|
||||||
|
where datasetName='".$this->setName."'");
|
||||||
|
$this->setName=$datasetName;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Datasets name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getDatasetName()
|
||||||
|
{
|
||||||
|
return $this->setName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a NamedGraph to the set.
|
||||||
|
*
|
||||||
|
* @param NamedGraphDb
|
||||||
|
*/
|
||||||
|
function addNamedGraph(&$graph)
|
||||||
|
{
|
||||||
|
$graphNameURI=$graph->getGraphName();
|
||||||
|
$this->removeNamedGraph($graphNameURI);
|
||||||
|
$this->dbConnection->execute('INSERT INTO dataset_model VALUES('
|
||||||
|
. $this->dbConnection->qstr($this->setName) . ','
|
||||||
|
. $this->dbConnection->qstr($graph->modelID) . ','
|
||||||
|
. $this->dbConnection->qstr($graphNameURI) .')');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrites the existting default graph.
|
||||||
|
*
|
||||||
|
* @param DbModel
|
||||||
|
*/
|
||||||
|
function setDefaultGraph(&$graph)
|
||||||
|
{
|
||||||
|
$this->dbConnection->execute('UPDATE datasets SET defaultModelUri ='
|
||||||
|
. $this->dbConnection->qstr($graph->modelURI) . ' WHERE datasetName ='
|
||||||
|
. $this->dbConnection->qstr($this->setName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reference to the defaultGraph.
|
||||||
|
*
|
||||||
|
* @return NamedGraphDb
|
||||||
|
*/
|
||||||
|
function & getDefaultGraph()
|
||||||
|
{
|
||||||
|
$defaultGraphURI = $this->dbConnection->GetOne("SELECT defaultModelUri FROM datasets WHERE datasetName ='".$this->setName."'");
|
||||||
|
return ($this->dbStore->getNamedGraphDb($defaultGraphURI,'http://rdfapi-php/dataset_defaultGraph_'.$this->setName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, if a defaultGraph exists. False otherwise.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function hasDefaultGraph()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a NamedGraph from the set. Nothing happens
|
||||||
|
* if no graph with that name is contained in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
*/
|
||||||
|
function removeNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
$this->dbConnection->execute('DELETE FROM dataset_model WHERE datasetName="'
|
||||||
|
. $this->dbConnection->qstr($this->setName) . '" AND graphURI ="'
|
||||||
|
. $this->dbConnection->qstr($graphName) . '"');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a NamedGraph.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
$count= $this->dbConnection->GetOne('SELECT count(*) FROM dataset_model WHERE datasetName="'.$this->setName.'" AND graphURI ="'.$graphName.'"');
|
||||||
|
return ($count>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the NamedGraph with a specific name from the Dataset.
|
||||||
|
* Changes to the graph will be reflected in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphDb or null
|
||||||
|
*/
|
||||||
|
function &getNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
if(!$this->containsNamedGraph($graphName))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$modelVars =& $this->dbConnection->execute("SELECT models.modelURI, models.modelID, models.baseURI
|
||||||
|
FROM models, dataset_model
|
||||||
|
WHERE dataset_model.graphURI ='" .$graphName ."' AND dataset_model.modelId= models.modelID");
|
||||||
|
|
||||||
|
return new NamedGraphDb($this->dbConnection, $modelVars->fields[0],
|
||||||
|
$modelVars->fields[1], $graphName ,$modelVars->fields[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the names of the namedGraphs in this set as strings in an array.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
function listGraphNames()
|
||||||
|
{
|
||||||
|
$recordSet =& $this->dbConnection->execute("SELECT graphURI FROM dataset_model WHERE datasetName ='".$this->setName."'");
|
||||||
|
|
||||||
|
$return=array();
|
||||||
|
while (!$recordSet->EOF)
|
||||||
|
{
|
||||||
|
$return[] = $recordSet->fields[0];
|
||||||
|
$recordSet->moveNext();
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new NamedGraph and adds it to the set. An existing graph with the same name will be replaced. But the old namedGraph remains in the database.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphDb
|
||||||
|
*/
|
||||||
|
function &createGraph($graphName,$baseURI = null)
|
||||||
|
{
|
||||||
|
$graph =& $this->dbStore->getNewNamedGraphDb(uniqid('http://rdfapi-php/namedGraph_'),$graphName,$baseURI);
|
||||||
|
$this->addNamedGraph($graph);
|
||||||
|
|
||||||
|
return $graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all NamedGraphs from the set.
|
||||||
|
*/
|
||||||
|
function clear()
|
||||||
|
{
|
||||||
|
$this->dbConnection->execute("DELETE FROM dataset_model WHERE datasetName ='".$this->setName."'");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of NamedGraphs in the set. Empty graphs are counted.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countGraphs()
|
||||||
|
{
|
||||||
|
return ($this->dbConnection->GetOne("SELECT count(*) FROM dataset_model WHERE datasetName ='".$this->setName."'"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over all {@link NamedGraph}s in the set.
|
||||||
|
*
|
||||||
|
* @return IteratorAllGraphsDb
|
||||||
|
*/
|
||||||
|
function &listNamedGraphs()
|
||||||
|
{
|
||||||
|
$recordSet =& $this->dbConnection->execute("SELECT graphURI FROM dataset_model WHERE datasetName ='".$this->setName."'");
|
||||||
|
$it = new IteratorAllGraphsDb($recordSet, $this);
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the set contains any NamedGraphs.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function isEmpty()
|
||||||
|
{
|
||||||
|
return ($this->countGraphs()==0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all named graphs of the other dataset to this dataset.
|
||||||
|
*
|
||||||
|
* @param Dataset
|
||||||
|
*/
|
||||||
|
function addAll($otherDataset)
|
||||||
|
{
|
||||||
|
for($iterator = $otherDataset->listNamedGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
{
|
||||||
|
$this->addNamedGraph($iterator->current());
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($otherDataset->hasDefaultGraph())
|
||||||
|
{
|
||||||
|
$this->defaultGraph = $this->defaultGraph->unite($otherDataset->getDefaultGraph());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Quad level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a quad to the Dataset. The argument must not contain any
|
||||||
|
* wildcards. If the quad is already present, nothing happens. A new
|
||||||
|
* named graph will automatically be created if necessary.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function addQuad(&$quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();
|
||||||
|
$graphName=$graphName->getLabel();
|
||||||
|
|
||||||
|
$graph=& $this->getNamedGraph($graphName);
|
||||||
|
|
||||||
|
if ($graph===null)
|
||||||
|
$graph=& $this->createGraph($graphName);
|
||||||
|
|
||||||
|
$statement=$quad->getStatement();
|
||||||
|
$graph->add($statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a quad or
|
||||||
|
* quads matching a pattern.
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsQuad($graphName,$subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "SELECT count(*)
|
||||||
|
FROM statements, dataset_model
|
||||||
|
WHERE datasetName ='".$this->setName."' AND statements.modelID=dataset_model.modelId ";
|
||||||
|
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
$sql.= " AND graphURI ='".$graphName->getLabel()."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($subject, $predicate, $object);
|
||||||
|
|
||||||
|
return (($this->dbConnection->GetOne($sql))>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a Quad from the RDF dataset.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function removeQuad($quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();$graphName=$graphName->getLabel();
|
||||||
|
//find namedGraph IDs
|
||||||
|
$graphID = $this->dbConnection->GetOne("SELECT modelId FROM dataset_model WHERE graphURI ='$graphName'");
|
||||||
|
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "DELETE FROM statements WHERE modelID = $graphID";
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($quad->getSubject(), $quad->getPredicate(), $quad->getObject());
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
if($graphID)
|
||||||
|
$recordSet =& $this->dbConnection->execute($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the Quads in the RDF dataset. Identical Triples in
|
||||||
|
* different NamedGraphs are counted individually.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countQuads()
|
||||||
|
{
|
||||||
|
$sql = "SELECT count(*)
|
||||||
|
FROM statements, dataset_model
|
||||||
|
WHERE datasetName ='".$this->setName."' AND statements.modelID=dataset_model.modelId ";
|
||||||
|
|
||||||
|
return ((int)$this->dbConnection->GetOne($sql));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a quad pattern. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @return IteratorFindQuadsDb
|
||||||
|
*/
|
||||||
|
function &findInNamedGraphs($graphName,$subject,$predicate,$object,$returnAsTriples =false )
|
||||||
|
{
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "SELECT subject, predicate, object, l_language, l_datatype, subject_is, object_is, dataset_model.graphURI
|
||||||
|
FROM statements, dataset_model
|
||||||
|
WHERE datasetName ='".$this->setName."' AND statements.modelID=dataset_model.modelId ";
|
||||||
|
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
$sql.= " AND graphURI ='".$graphName->getLabel()."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($subject, $predicate, $object);
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
$recordSet =& $this->dbConnection->execute($sql);
|
||||||
|
|
||||||
|
|
||||||
|
$it = new IteratorFindQuadsDb($recordSet, $this, $returnAsTriples);
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a pattern in the default Graph. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @return IteratorFindQuadsDb
|
||||||
|
*/
|
||||||
|
function &findInDefaultGraph($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
$defaultGraphID = (int)$this->dbConnection->GetOne("SELECT models.modelID FROM datasets, models WHERE datasets.datasetName ='".$this->setName."' AND datasets.defaultModelUri = models.modelURI");
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "SELECT subject, predicate, object, l_language, l_datatype, subject_is, object_is
|
||||||
|
FROM statements
|
||||||
|
WHERE modelID ='$defaultGraphID'";
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($subject, $predicate, $object);
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
$recordSet =& $this->dbConnection->execute($sql);
|
||||||
|
|
||||||
|
$it = new IteratorFindQuadsDb($recordSet, $this, true);
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,394 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphMem.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'model/MemModel.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: DatasetMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In-memory implementation of a RDF dataset.
|
||||||
|
* A RDF dataset set is a collection of named RDF graphs.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
* @author Chris Bizer <chris@bizer.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class DatasetMem extends Dataset
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to a Memmodel that holds the default graph.
|
||||||
|
*
|
||||||
|
* @var resource Memmodel
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $defaultGraph;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the DatasetMem.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $setName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of all NamedGraphs.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphs=array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* You can supply a Dataset name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function DatasetMem($datasetName = null)
|
||||||
|
{
|
||||||
|
$this->setDatasetName($datasetName);
|
||||||
|
$this->defaultGraph=new MemModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Graph level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the Datasets name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setDatasetName($datasetName)
|
||||||
|
{
|
||||||
|
$this->setName=$datasetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Datasets name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getDatasetName()
|
||||||
|
{
|
||||||
|
return $this->setName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a NamedGraph to the set. Will replace a NamedGraph with the same name that is already in the set.
|
||||||
|
*
|
||||||
|
* @param NamedGraphMem
|
||||||
|
*/
|
||||||
|
function addNamedGraph(&$graph)
|
||||||
|
{
|
||||||
|
$graphNameURI=$graph->getGraphName();
|
||||||
|
$this->graphs[$graphNameURI]=&$graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrites the existting default graph.
|
||||||
|
*
|
||||||
|
* @param MemModel
|
||||||
|
*/
|
||||||
|
function setDefaultGraph(&$graph)
|
||||||
|
{
|
||||||
|
$this->defaultGraph=&$graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reference to the defaultGraph
|
||||||
|
* @return Model
|
||||||
|
*/
|
||||||
|
function &getDefaultGraph()
|
||||||
|
{
|
||||||
|
return $this->defaultGraph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, if an defaultGraph exists. False otherwise .
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function hasDefaultGraph()
|
||||||
|
{
|
||||||
|
return $this->defaultGraph != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a NamedGraph from the set. Nothing happens
|
||||||
|
* if no graph with that name is contained in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
*/
|
||||||
|
function removeNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
unset($this->graphs[$graphName]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a NamedGraph.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
return isset($this->graphs[$graphName]) === true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the NamedGraph with a specific name from the Dataset.
|
||||||
|
* Changes to the graph will be reflected in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphMem or NULL
|
||||||
|
*/
|
||||||
|
function &getNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
if (!isset($this->graphs[$graphName])) return NULL;
|
||||||
|
return $this->graphs[$graphName];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the names of the namedGraphs in this set as strings in an array.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
function listGraphNames()
|
||||||
|
{
|
||||||
|
return array_keys($this->graphs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new NamedGraph and adds it to the set. An existing
|
||||||
|
* graph with the same name will be replaced.The name of the NamedGraph to be created ; must be an URI
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphMem
|
||||||
|
*/
|
||||||
|
function &createGraph($graphName,$baseURI = null)
|
||||||
|
{
|
||||||
|
$this->graphs[$graphName]=new NamedGraphMem($graphName,$baseURI);
|
||||||
|
return $this->getNamedGraph($graphName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all NamedGraphs from the set.
|
||||||
|
*/
|
||||||
|
function clear()
|
||||||
|
{
|
||||||
|
$this->graphs = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of NamedGraphs in the set. Empty graphs
|
||||||
|
* are counted.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countGraphs()
|
||||||
|
{
|
||||||
|
return count($this->graphs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the NamedGraph with a specific offset in the dataset.
|
||||||
|
* Changes to the graph will be reflected in the set.
|
||||||
|
*
|
||||||
|
* @param int
|
||||||
|
* @return NamedGraphMem or null
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function &getGraphWithOffset($offset)
|
||||||
|
{
|
||||||
|
$i=0;
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
if (($i++)==$offset)
|
||||||
|
return $graph;
|
||||||
|
}
|
||||||
|
$n = null;
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over all {@link NamedGraph}s in the set.
|
||||||
|
*
|
||||||
|
* @return IteratorAllGraphsMem
|
||||||
|
*/
|
||||||
|
function &listNamedGraphs()
|
||||||
|
{
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsMem.php';
|
||||||
|
$m = new IteratorAllGraphsMem($this);
|
||||||
|
return $m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the set contains any NamedGraphs.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function isEmpty()
|
||||||
|
{
|
||||||
|
return $this->countGraphs() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds all named graphs of the other dataset to this dataset.
|
||||||
|
*
|
||||||
|
* @param Dataset
|
||||||
|
*/
|
||||||
|
function addAll($otherDataset)
|
||||||
|
{
|
||||||
|
for($iterator = $otherDataset->listNamedGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
{
|
||||||
|
$current=$iterator->current();
|
||||||
|
$this->graphs[$current->getGraphName()]=$current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($otherDataset->hasDefaultGraph())
|
||||||
|
{
|
||||||
|
$this->defaultGraph = $this->defaultGraph->unite($otherDataset->getDefaultGraph());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Quad level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a quad to the Dataset. The argument must not contain any
|
||||||
|
* wildcards. If the quad is already present, nothing happens. A new
|
||||||
|
* named graph will automatically be created if necessary.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function addQuad(&$quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();
|
||||||
|
if ($this->containsNamedGraph($graphName->getLabel())===false)
|
||||||
|
$this->createGraph($graphName->getLabel());
|
||||||
|
|
||||||
|
$this->graphs[$graphName->getLabel()]->add($quad->getStatement());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a quad or
|
||||||
|
* quads matching a pattern.
|
||||||
|
*
|
||||||
|
* @param Resource $graphName
|
||||||
|
* @param Resource $subject
|
||||||
|
* @param Resource $predicate
|
||||||
|
* @param Resource $object
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsQuad($graphName,$subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
if ($this->containsNamedGraph($graphName->getLabel())!==true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return ($this->graphs[$graphName->getLabel()]->findFirstMatchingStatement($subject,$predicate,$object)!=null);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
if ($graph->findFirstMatchingStatement($subject,$predicate,$object)!=null)
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a Quad from the RDF dataset.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function removeQuad($quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();
|
||||||
|
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
if ($this->containsNamedGraph($graphName->getLabel())!==true)
|
||||||
|
return;
|
||||||
|
|
||||||
|
return ($this->graphs[$graphName->getLabel()]->remove($quad->getStatement())!=null);
|
||||||
|
|
||||||
|
}
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
$graph->remove($quad->getStatement());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the Quads in the RDF dataset. Identical Triples in
|
||||||
|
* different NamedGraphs are counted individually.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countQuads()
|
||||||
|
{
|
||||||
|
$count=0;
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
$count+=$graph->size();
|
||||||
|
}
|
||||||
|
return $count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a quad pattern. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resourceor Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @return Iterator
|
||||||
|
*/
|
||||||
|
function &findInNamedGraphs($graph,$subject,$predicate,$object,$returnAsTriples = false)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($graph!=null)
|
||||||
|
{
|
||||||
|
$findGraph=&$this->getNamedGraph($graph->getLabel());
|
||||||
|
if($findGraph==null)
|
||||||
|
$findGraph=new MemModel();
|
||||||
|
|
||||||
|
return $findGraph->iterFind($subject,$predicate,$object);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsMem.php';
|
||||||
|
$m = new IteratorFindQuadsMem($subject,$predicate,$object,$this->listNamedGraphs(),$returnAsTriples);
|
||||||
|
return $m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a pattern in the default Graph. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @return Iterator
|
||||||
|
*/
|
||||||
|
function &findInDefaultGraph($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
return $this->defaultGraph->iterFind($subject,$predicate,$object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// dataset Package
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Description : dataset package
|
||||||
|
//
|
||||||
|
// Author: Daniel Westphal <http://www.d-westphal.de>
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Include ResModel classes
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/DatasetMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/DatasetDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/Quad.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'syntax/TriXParser.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'syntax/TriXSerializer.php');
|
||||||
|
?>
|
||||||
@ -0,0 +1,127 @@
|
|||||||
|
<?php
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorAllGraphsDb
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a Graph iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used in a for-loop like:
|
||||||
|
* for($iterator = $dataset->listGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentResource=$iterator->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorAllGraphsDb
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated DB resultSet
|
||||||
|
* @var $dbResultSets ADODB result
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbResultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated datasetDb
|
||||||
|
* @var datasetDb
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $datasetDb;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current position
|
||||||
|
* @var integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $key;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current NamedGraph
|
||||||
|
* @var obejct NamedGraph
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $current;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param ADODBResultSet
|
||||||
|
* @param DatasetDb
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorAllGraphsDb(&$dbResultSet,&$datasetDb)
|
||||||
|
{
|
||||||
|
$this->dbResultSet=& $dbResultSet;
|
||||||
|
$this->datasetDb=& $datasetDb;
|
||||||
|
$this->current = $this->dbResultSet->fields[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
//not supported
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
return (!$this->dbResultSet->EOF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
$this->dbResultSet->moveNext();
|
||||||
|
$this->current = $this->dbResultSet->fields[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function ¤t()
|
||||||
|
{
|
||||||
|
return ($this->datasetDb->getNamedGraph($this->current));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->dbResultSet->_currentRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorAllGraphsMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a Graph iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used in a for-loop like:
|
||||||
|
* for($iterator = $dataset->listGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentResource=$it->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorAllGraphsMem
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated RDF dataset
|
||||||
|
*
|
||||||
|
* @var object dataset
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $associatedGraphSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current position
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the current resource is valid
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current NamedGraph
|
||||||
|
*
|
||||||
|
* @var obejct NamedGraph
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $current;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param dataset
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorAllGraphsMem(&$namedGraphSet)
|
||||||
|
{
|
||||||
|
$this->associatedGraphSet=&$namedGraphSet;
|
||||||
|
$this->rewind();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
$this->key = -1;
|
||||||
|
$this->next();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
return $this->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
$this->current = &$this->associatedGraphSet->getGraphWithOffset(++$this->key);
|
||||||
|
$this->valid=($this->current!=NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function ¤t()
|
||||||
|
{
|
||||||
|
return $this->current;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,145 @@
|
|||||||
|
<?php
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorFindQuadsDb
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a quad iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used like:
|
||||||
|
* for($iterator = $dataset->findInNamedGraphs(null,null,null,null); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentQuad=$iterator->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorFindQuadsDb
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated DB resultSet.
|
||||||
|
*
|
||||||
|
* @var $dbResultSets ADODB result
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbResultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated datasetDb.
|
||||||
|
*
|
||||||
|
* @var $datasetDb datasetDb
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $datasetDb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* boolean value, if the results should be returned as triples.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $returnAsTriples;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param dataset
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorFindQuadsDb(&$dbResultSet,&$datasetDb,$returnAsTriples=false)
|
||||||
|
{
|
||||||
|
$this->dbResultSet=& $dbResultSet;
|
||||||
|
$this->datasetDb=& $datasetDb;
|
||||||
|
$this->returnAsTriples=$returnAsTriples;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
//not supported
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
if (($this->dbResultSet ===false) OR ($this->dbResultSet->EOF) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
if ($this->dbResultSet!==false)
|
||||||
|
$this->dbResultSet->moveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function ¤t()
|
||||||
|
{
|
||||||
|
if ($this->dbResultSet===false)
|
||||||
|
return null;
|
||||||
|
// subject
|
||||||
|
if ($this->dbResultSet->fields[5] == 'r')
|
||||||
|
$sub = new Resource($this->dbResultSet->fields[0]);
|
||||||
|
else
|
||||||
|
$sub = new BlankNode($this->dbResultSet->fields[0]);
|
||||||
|
|
||||||
|
// predicate
|
||||||
|
$pred = new Resource($this->dbResultSet->fields[1]);
|
||||||
|
|
||||||
|
// object
|
||||||
|
if ($this->dbResultSet->fields[6] == 'r')
|
||||||
|
$obj = new Resource($this->dbResultSet->fields[2]);
|
||||||
|
elseif ($this->dbResultSet->fields[6] == 'b')
|
||||||
|
$obj = new BlankNode($this->dbResultSet->fields[2]);
|
||||||
|
else {
|
||||||
|
$obj = new Literal($this->dbResultSet->fields[2], $this->dbResultSet->fields[3]);
|
||||||
|
if ($this->dbResultSet->fields[4])
|
||||||
|
$obj->setDatatype($this->dbResultSet->fields[4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->returnAsTriples)
|
||||||
|
return (new Statement($sub, $pred, $obj));
|
||||||
|
|
||||||
|
return (new Quad(new Resource($this->dbResultSet->fields[7]),$sub,$pred,$obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->dbResultSet->_currentRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,217 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/Quad.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorFindQuadsMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a quad iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used like:
|
||||||
|
* for($iterator = $dataset->findInNamedGraphs(null,null,null,null); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentQuad=$it->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://d-westphal.de)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorFindQuadsMem
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* key value in the current graph.
|
||||||
|
*
|
||||||
|
* @var dataset
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* boolean value, if the results should be returned as triples.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $returnAsTriples;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current position.
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the current resource is valid.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current NamedGraph.
|
||||||
|
*
|
||||||
|
* @var NamedGraph
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $current;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The graphName Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findGraphName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The subject Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findSubject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The predicate Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findPredicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The object Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterator over all graphs of the RDF dataset.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphIterator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* $subject, $predicate, and $object are used like find().
|
||||||
|
* $getSPO supports the strings 's', 'p', and 'o' to return
|
||||||
|
* either the subject, predicate, or object of the result statements.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param dataset
|
||||||
|
* @param Boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorFindQuadsMem($subject,$predicate,$object,&$graphIterator, $returnAsTriples=false)
|
||||||
|
{
|
||||||
|
$this->findSubject=$subject;
|
||||||
|
$this->findPredicate=$predicate;
|
||||||
|
$this->findObject=$object;
|
||||||
|
$this->graphIterator=&$graphIterator;
|
||||||
|
$this->rewind();
|
||||||
|
$this->returnAsTriples=$returnAsTriples;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
$this->graphIterator->rewind();
|
||||||
|
$this->key = -1;
|
||||||
|
$this->graphKey=-1;
|
||||||
|
$this->next();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
return $this->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
if($this->graphIterator->valid()===false)
|
||||||
|
{
|
||||||
|
$this->valid=false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentGraph=&$this->graphIterator->current();
|
||||||
|
$this->current= $currentGraph->findFirstMatchingStatement($this->findSubject,$this->findPredicate,$this->findObject,++$this->graphKey);
|
||||||
|
if($this->current==null)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$this->graphIterator->next();
|
||||||
|
if($this->graphIterator->valid()===false)
|
||||||
|
{
|
||||||
|
$this->valid=false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$currentGraph=&$this->graphIterator->current();
|
||||||
|
$this->graphKey=-1;
|
||||||
|
$this->current= $currentGraph->findFirstMatchingStatement($this->findSubject,$this->findPredicate,$this->findObject,++$this->graphKey);
|
||||||
|
|
||||||
|
} while ($this->current==null);
|
||||||
|
}
|
||||||
|
$this->key++;
|
||||||
|
$this->valid=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function current()
|
||||||
|
{
|
||||||
|
if($this->returnAsTriples) return $this->current;
|
||||||
|
|
||||||
|
$currentGraph=&$this->graphIterator->current();
|
||||||
|
return new Quad(new Resource($currentGraph->getGraphName()),$this->current->getSubject(),$this->current->getPredicate(),$this->current->getObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: NamedGraphDb
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent NamedGraph implementation that extends a {@link DbModel}.
|
||||||
|
* The graphName is not stored in the database. As soon as the namedGraph is added
|
||||||
|
* to a RDF dataset the graphName is saved.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class NamedGraphDb extends DbModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the NamedGraphDb
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* Do not call this directly.
|
||||||
|
* Use the method getModel,getNewModel or putModel of the Class NamedGraphDb instead.
|
||||||
|
*
|
||||||
|
* @param ADODBConnection
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function NamedGraphDb(&$dbConnection, $modelURI, $modelID,$graphName, $baseURI=NULL)
|
||||||
|
{
|
||||||
|
$this->dbConn =& $dbConnection;
|
||||||
|
$this->modelURI = $modelURI;
|
||||||
|
$this->modelID = $modelID;
|
||||||
|
$this->baseURI = $this->_checkBaseURI($baseURI);
|
||||||
|
$this->graphName = $graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graph name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setGraphName($graphName)
|
||||||
|
{
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the graph name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getGraphName()
|
||||||
|
{
|
||||||
|
return $this->graphName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'model/MemModel.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: NamedGraphMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NamedGraph implementation that extends a {@link MemModel}
|
||||||
|
* with a name.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <http://www.d-westphal.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class NamedGraphMem extends MemModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the NamedGraphMem.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphName;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You have to supply a graph name. You can supply a URI.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function NamedGraphMem($graphName,$baseURI = null)
|
||||||
|
{
|
||||||
|
$this->setBaseURI($baseURI);
|
||||||
|
$this->indexed = INDEX_TYPE;
|
||||||
|
$this->setGraphName($graphName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graph name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setGraphName($graphName)
|
||||||
|
{
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the graph name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getGraphName()
|
||||||
|
{
|
||||||
|
return $this->graphName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,147 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: Quad
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* A Triple in a RDF dataset, consisting of four Jena Nodes: graphName,
|
||||||
|
* subject, predicate, and object.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class Quad
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the NamedGraphMem.
|
||||||
|
*
|
||||||
|
* @var Resource
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Statement
|
||||||
|
*
|
||||||
|
* @var Statement
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $statement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* Creates a Quad from four Nodes.
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function Quad($graphName,$subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
if (!is_a($graphName, 'Resource'))
|
||||||
|
{
|
||||||
|
$errmsg = RDFAPI_ERROR .
|
||||||
|
'(class: Quad; method: new): Resource expected as graphName.';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
$this->statement=new Statement($subject,$predicate,$object);
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graph name.
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setGraphName($graphName)
|
||||||
|
{
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the graph name.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getGraphName()
|
||||||
|
{
|
||||||
|
return $this->graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a human-readable (sort of) string "graphname { s p o . }"
|
||||||
|
* describing the quad.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toString()
|
||||||
|
{
|
||||||
|
return 'GraphName('.$this->graphName->getLabel().') '.$this->statement->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the subject.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getSubject()
|
||||||
|
{
|
||||||
|
return $this->statement->getSubject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the predicate.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getPredicate()
|
||||||
|
{
|
||||||
|
return $this->statement->getPredicate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the object.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getObject()
|
||||||
|
{
|
||||||
|
return $this->statement->getObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the statement(subject,predicate,object).
|
||||||
|
*
|
||||||
|
* @return statement
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getStatement()
|
||||||
|
{
|
||||||
|
return $this->statement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if two quads are equal.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function equals($quad)
|
||||||
|
{
|
||||||
|
return ($this->graphName->equals($quad->getGraphName()) && $this->statement->equals($quad->getStatement()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: Dataset
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dataset implementation.
|
||||||
|
* Superclass of datasetMem and datasetDb which contains shared functionality.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
* @author Chris Bizer <chris@bizer.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class Dataset
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Load a Dataset from a File
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function loadFromFile($file)
|
||||||
|
{
|
||||||
|
$parser= new TriXParser($this);
|
||||||
|
$parser->parseFile($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a Datset from a string
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function loadFromString($string)
|
||||||
|
{
|
||||||
|
$parser= new TriXParser($this);
|
||||||
|
$parser->parseString($string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize the Dataset to File
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function serializeToFile($fileName)
|
||||||
|
{
|
||||||
|
$serializer= new TriXSerializer($this);
|
||||||
|
$serializer->serializeToFile($fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize the Dataset to string
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function serializeToString()
|
||||||
|
{
|
||||||
|
$serializer= new TriXSerializer($this);
|
||||||
|
return $serializer->serializeToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs a SPARQL query against an RDF Dataset.
|
||||||
|
* The result can be retrived in SPARQL Query Results XML Format or
|
||||||
|
* as an array containing the variables an their bindings.
|
||||||
|
*
|
||||||
|
* @param String $query the sparql query string
|
||||||
|
* @param String $resultform the result form ('xml' for SPARQL Query Results XML Format)
|
||||||
|
* @return String/array
|
||||||
|
*/
|
||||||
|
function sparqlQuery($query,$resultform = false){
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_SPARQL);
|
||||||
|
$parser = new SparqlParser();
|
||||||
|
$q = $parser->parse($query);
|
||||||
|
|
||||||
|
$eng = SparqlEngine::factory();
|
||||||
|
return $eng->queryModel($this,$q,$resultform);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,451 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'model/DbModel.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsDb.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: DatasetDb
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent implementation of a Dataset in a database.
|
||||||
|
* A RDF dataset is a collection of named RDF graphs.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
* @author Chris Bizer <chris@bizer.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
require_once(RDFAPI_INCLUDE_DIR.PACKAGE_DBASE);
|
||||||
|
|
||||||
|
class DatasetDb extends Dataset
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to databse connection.
|
||||||
|
*
|
||||||
|
* @var resource dbConnection
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbConnection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to the dbStore Object.
|
||||||
|
*
|
||||||
|
* @var $dbStore dbStore
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbStore;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the Dataset
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $setName;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a Dataset name.
|
||||||
|
*
|
||||||
|
* @param ADODBConnection
|
||||||
|
* @param DbStore
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function DatasetDb(&$dbConnection,&$dbStore,$datasetName)
|
||||||
|
{
|
||||||
|
$this->dbConnection=& $dbConnection;
|
||||||
|
$this->dbStore=&$dbStore;
|
||||||
|
$this->setName= $datasetName;
|
||||||
|
$this->_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize
|
||||||
|
* Read all needed data into the set.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _initialize()
|
||||||
|
{
|
||||||
|
$recordSet =& $this->dbConnection->execute("SELECT defaultModelUri
|
||||||
|
FROM datasets where datasetName='".$this->setName."'");
|
||||||
|
|
||||||
|
$this->defaultGraph=& $this->dbStore->getModel($recordSet->fields[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// === Graph level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the Dataset name. Return true on success, false otherwise.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setDatasetName($datasetName)
|
||||||
|
{
|
||||||
|
if ($this->dbStore->datasetExists($datasetName))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->dbConnection->execute("UPDATE datasets SET datasetName='".$datasetName."'
|
||||||
|
where datasetName='".$this->setName."'");
|
||||||
|
|
||||||
|
$this->dbConnection->execute("UPDATE dataset_model SET datasetName='".$datasetName."'
|
||||||
|
where datasetName='".$this->setName."'");
|
||||||
|
$this->setName=$datasetName;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Datasets name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getDatasetName()
|
||||||
|
{
|
||||||
|
return $this->setName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a NamedGraph to the set.
|
||||||
|
*
|
||||||
|
* @param NamedGraphDb
|
||||||
|
*/
|
||||||
|
function addNamedGraph(&$graph)
|
||||||
|
{
|
||||||
|
$graphNameURI=$graph->getGraphName();
|
||||||
|
$this->removeNamedGraph($graphNameURI);
|
||||||
|
$this->dbConnection->execute('INSERT INTO dataset_model VALUES('
|
||||||
|
. $this->dbConnection->qstr($this->setName) . ','
|
||||||
|
. $this->dbConnection->qstr($graph->modelID) . ','
|
||||||
|
. $this->dbConnection->qstr($graphNameURI) .')');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrites the existting default graph.
|
||||||
|
*
|
||||||
|
* @param DbModel
|
||||||
|
*/
|
||||||
|
function setDefaultGraph(&$graph)
|
||||||
|
{
|
||||||
|
$this->dbConnection->execute('UPDATE datasets SET defaultModelUri ='
|
||||||
|
. $this->dbConnection->qstr($graph->modelURI) . ' WHERE datasetName ='
|
||||||
|
. $this->dbConnection->qstr($this->setName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reference to the defaultGraph.
|
||||||
|
*
|
||||||
|
* @return NamedGraphDb
|
||||||
|
*/
|
||||||
|
function & getDefaultGraph()
|
||||||
|
{
|
||||||
|
$defaultGraphURI = $this->dbConnection->GetOne("SELECT defaultModelUri FROM datasets WHERE datasetName ='".$this->setName."'");
|
||||||
|
return ($this->dbStore->getNamedGraphDb($defaultGraphURI,'http://rdfapi-php/dataset_defaultGraph_'.$this->setName));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, if a defaultGraph exists. False otherwise.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function hasDefaultGraph()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a NamedGraph from the set. Nothing happens
|
||||||
|
* if no graph with that name is contained in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
*/
|
||||||
|
function removeNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
$this->dbConnection->execute('DELETE FROM dataset_model WHERE datasetName="'
|
||||||
|
. $this->dbConnection->qstr($this->setName) . '" AND graphURI ="'
|
||||||
|
. $this->dbConnection->qstr($graphName) . '"');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a NamedGraph.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
$count= $this->dbConnection->GetOne('SELECT count(*) FROM dataset_model WHERE datasetName="'.$this->setName.'" AND graphURI ="'.$graphName.'"');
|
||||||
|
return ($count>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the NamedGraph with a specific name from the Dataset.
|
||||||
|
* Changes to the graph will be reflected in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphDb or null
|
||||||
|
*/
|
||||||
|
function &getNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
if(!$this->containsNamedGraph($graphName))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$modelVars =& $this->dbConnection->execute("SELECT models.modelURI, models.modelID, models.baseURI
|
||||||
|
FROM models, dataset_model
|
||||||
|
WHERE dataset_model.graphURI ='" .$graphName ."' AND dataset_model.modelId= models.modelID");
|
||||||
|
|
||||||
|
return new NamedGraphDb($this->dbConnection, $modelVars->fields[0],
|
||||||
|
$modelVars->fields[1], $graphName ,$modelVars->fields[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the names of the namedGraphs in this set as strings in an array.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
function listGraphNames()
|
||||||
|
{
|
||||||
|
$recordSet =& $this->dbConnection->execute("SELECT graphURI FROM dataset_model WHERE datasetName ='".$this->setName."'");
|
||||||
|
|
||||||
|
$return=array();
|
||||||
|
while (!$recordSet->EOF)
|
||||||
|
{
|
||||||
|
$return[] = $recordSet->fields[0];
|
||||||
|
$recordSet->moveNext();
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new NamedGraph and adds it to the set. An existing graph with the same name will be replaced. But the old namedGraph remains in the database.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphDb
|
||||||
|
*/
|
||||||
|
function &createGraph($graphName,$baseURI = null)
|
||||||
|
{
|
||||||
|
$graph =& $this->dbStore->getNewNamedGraphDb(uniqid('http://rdfapi-php/namedGraph_'),$graphName,$baseURI);
|
||||||
|
$this->addNamedGraph($graph);
|
||||||
|
|
||||||
|
return $graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all NamedGraphs from the set.
|
||||||
|
*/
|
||||||
|
function clear()
|
||||||
|
{
|
||||||
|
$this->dbConnection->execute("DELETE FROM dataset_model WHERE datasetName ='".$this->setName."'");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of NamedGraphs in the set. Empty graphs are counted.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countGraphs()
|
||||||
|
{
|
||||||
|
return ($this->dbConnection->GetOne("SELECT count(*) FROM dataset_model WHERE datasetName ='".$this->setName."'"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over all {@link NamedGraph}s in the set.
|
||||||
|
*
|
||||||
|
* @return IteratorAllGraphsDb
|
||||||
|
*/
|
||||||
|
function &listNamedGraphs()
|
||||||
|
{
|
||||||
|
$recordSet =& $this->dbConnection->execute("SELECT graphURI FROM dataset_model WHERE datasetName ='".$this->setName."'");
|
||||||
|
$it = new IteratorAllGraphsDb($recordSet, $this);
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the set contains any NamedGraphs.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function isEmpty()
|
||||||
|
{
|
||||||
|
return ($this->countGraphs()==0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all named graphs of the other dataset to this dataset.
|
||||||
|
*
|
||||||
|
* @param Dataset
|
||||||
|
*/
|
||||||
|
function addAll($otherDataset)
|
||||||
|
{
|
||||||
|
for($iterator = $otherDataset->listNamedGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
{
|
||||||
|
$this->addNamedGraph($iterator->current());
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($otherDataset->hasDefaultGraph())
|
||||||
|
{
|
||||||
|
$this->defaultGraph = $this->defaultGraph->unite($otherDataset->getDefaultGraph());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Quad level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a quad to the Dataset. The argument must not contain any
|
||||||
|
* wildcards. If the quad is already present, nothing happens. A new
|
||||||
|
* named graph will automatically be created if necessary.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function addQuad(&$quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();
|
||||||
|
$graphName=$graphName->getLabel();
|
||||||
|
|
||||||
|
$graph=& $this->getNamedGraph($graphName);
|
||||||
|
|
||||||
|
if ($graph===null)
|
||||||
|
$graph=& $this->createGraph($graphName);
|
||||||
|
|
||||||
|
$statement=$quad->getStatement();
|
||||||
|
$graph->add($statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a quad or
|
||||||
|
* quads matching a pattern.
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsQuad($graphName,$subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "SELECT count(*)
|
||||||
|
FROM statements, dataset_model
|
||||||
|
WHERE datasetName ='".$this->setName."' AND statements.modelID=dataset_model.modelId ";
|
||||||
|
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
$sql.= " AND graphURI ='".$graphName->getLabel()."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($subject, $predicate, $object);
|
||||||
|
|
||||||
|
return (($this->dbConnection->GetOne($sql))>0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a Quad from the RDF dataset.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function removeQuad($quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();$graphName=$graphName->getLabel();
|
||||||
|
//find namedGraph IDs
|
||||||
|
$graphID = $this->dbConnection->GetOne("SELECT modelId FROM dataset_model WHERE graphURI ='$graphName'");
|
||||||
|
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "DELETE FROM statements WHERE modelID = $graphID";
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($quad->getSubject(), $quad->getPredicate(), $quad->getObject());
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
if($graphID)
|
||||||
|
$recordSet =& $this->dbConnection->execute($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the Quads in the RDF dataset. Identical Triples in
|
||||||
|
* different NamedGraphs are counted individually.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countQuads()
|
||||||
|
{
|
||||||
|
$sql = "SELECT count(*)
|
||||||
|
FROM statements, dataset_model
|
||||||
|
WHERE datasetName ='".$this->setName."' AND statements.modelID=dataset_model.modelId ";
|
||||||
|
|
||||||
|
return ((int)$this->dbConnection->GetOne($sql));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a quad pattern. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @return IteratorFindQuadsDb
|
||||||
|
*/
|
||||||
|
function &findInNamedGraphs($graphName,$subject,$predicate,$object,$returnAsTriples =false )
|
||||||
|
{
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "SELECT subject, predicate, object, l_language, l_datatype, subject_is, object_is, dataset_model.graphURI
|
||||||
|
FROM statements, dataset_model
|
||||||
|
WHERE datasetName ='".$this->setName."' AND statements.modelID=dataset_model.modelId ";
|
||||||
|
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
$sql.= " AND graphURI ='".$graphName->getLabel()."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($subject, $predicate, $object);
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
$recordSet =& $this->dbConnection->execute($sql);
|
||||||
|
|
||||||
|
|
||||||
|
$it = new IteratorFindQuadsDb($recordSet, $this, $returnAsTriples);
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a pattern in the default Graph. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @param Resource or null
|
||||||
|
* @return IteratorFindQuadsDb
|
||||||
|
*/
|
||||||
|
function &findInDefaultGraph($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
$defaultGraphID = (int)$this->dbConnection->GetOne("SELECT models.modelID FROM datasets, models WHERE datasets.datasetName ='".$this->setName."' AND datasets.defaultModelUri = models.modelURI");
|
||||||
|
// static part of the sql statement
|
||||||
|
$sql = "SELECT subject, predicate, object, l_language, l_datatype, subject_is, object_is
|
||||||
|
FROM statements
|
||||||
|
WHERE modelID ='$defaultGraphID'";
|
||||||
|
|
||||||
|
// dynamic part of the sql statement
|
||||||
|
$sql .= DbModel::_createDynSqlPart_SPO($subject, $predicate, $object);
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
$recordSet =& $this->dbConnection->execute($sql);
|
||||||
|
|
||||||
|
$it = new IteratorFindQuadsDb($recordSet, $this, true);
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,394 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphMem.php';
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'model/MemModel.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: DatasetMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In-memory implementation of a RDF dataset.
|
||||||
|
* A RDF dataset set is a collection of named RDF graphs.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
* @author Chris Bizer <chris@bizer.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class DatasetMem extends Dataset
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to a Memmodel that holds the default graph.
|
||||||
|
*
|
||||||
|
* @var resource Memmodel
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $defaultGraph;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the DatasetMem.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $setName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of all NamedGraphs.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphs=array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* You can supply a Dataset name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function DatasetMem($datasetName = null)
|
||||||
|
{
|
||||||
|
$this->setDatasetName($datasetName);
|
||||||
|
$this->defaultGraph=new MemModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Graph level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the Datasets name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setDatasetName($datasetName)
|
||||||
|
{
|
||||||
|
$this->setName=$datasetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Datasets name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getDatasetName()
|
||||||
|
{
|
||||||
|
return $this->setName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a NamedGraph to the set. Will replace a NamedGraph with the same name that is already in the set.
|
||||||
|
*
|
||||||
|
* @param NamedGraphMem
|
||||||
|
*/
|
||||||
|
function addNamedGraph(&$graph)
|
||||||
|
{
|
||||||
|
$graphNameURI=$graph->getGraphName();
|
||||||
|
$this->graphs[$graphNameURI]=&$graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrites the existting default graph.
|
||||||
|
*
|
||||||
|
* @param MemModel
|
||||||
|
*/
|
||||||
|
function setDefaultGraph(&$graph)
|
||||||
|
{
|
||||||
|
$this->defaultGraph=&$graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reference to the defaultGraph
|
||||||
|
* @return Model
|
||||||
|
*/
|
||||||
|
function &getDefaultGraph()
|
||||||
|
{
|
||||||
|
return $this->defaultGraph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, if an defaultGraph exists. False otherwise .
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function hasDefaultGraph()
|
||||||
|
{
|
||||||
|
return $this->defaultGraph != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a NamedGraph from the set. Nothing happens
|
||||||
|
* if no graph with that name is contained in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
*/
|
||||||
|
function removeNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
unset($this->graphs[$graphName]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a NamedGraph.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
return isset($this->graphs[$graphName]) === true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the NamedGraph with a specific name from the Dataset.
|
||||||
|
* Changes to the graph will be reflected in the set.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphMem or NULL
|
||||||
|
*/
|
||||||
|
function &getNamedGraph($graphName)
|
||||||
|
{
|
||||||
|
if (!isset($this->graphs[$graphName])) return NULL;
|
||||||
|
return $this->graphs[$graphName];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the names of the namedGraphs in this set as strings in an array.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
function listGraphNames()
|
||||||
|
{
|
||||||
|
return array_keys($this->graphs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new NamedGraph and adds it to the set. An existing
|
||||||
|
* graph with the same name will be replaced.The name of the NamedGraph to be created ; must be an URI
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return NamedGraphMem
|
||||||
|
*/
|
||||||
|
function &createGraph($graphName,$baseURI = null)
|
||||||
|
{
|
||||||
|
$this->graphs[$graphName]=new NamedGraphMem($graphName,$baseURI);
|
||||||
|
return $this->getNamedGraph($graphName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes all NamedGraphs from the set.
|
||||||
|
*/
|
||||||
|
function clear()
|
||||||
|
{
|
||||||
|
$this->graphs = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of NamedGraphs in the set. Empty graphs
|
||||||
|
* are counted.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countGraphs()
|
||||||
|
{
|
||||||
|
return count($this->graphs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the NamedGraph with a specific offset in the dataset.
|
||||||
|
* Changes to the graph will be reflected in the set.
|
||||||
|
*
|
||||||
|
* @param int
|
||||||
|
* @return NamedGraphMem or null
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function &getGraphWithOffset($offset)
|
||||||
|
{
|
||||||
|
$i=0;
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
if (($i++)==$offset)
|
||||||
|
return $graph;
|
||||||
|
}
|
||||||
|
$n = null;
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over all {@link NamedGraph}s in the set.
|
||||||
|
*
|
||||||
|
* @return IteratorAllGraphsMem
|
||||||
|
*/
|
||||||
|
function &listNamedGraphs()
|
||||||
|
{
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsMem.php';
|
||||||
|
$m = new IteratorAllGraphsMem($this);
|
||||||
|
return $m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the set contains any NamedGraphs.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function isEmpty()
|
||||||
|
{
|
||||||
|
return $this->countGraphs() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds all named graphs of the other dataset to this dataset.
|
||||||
|
*
|
||||||
|
* @param Dataset
|
||||||
|
*/
|
||||||
|
function addAll($otherDataset)
|
||||||
|
{
|
||||||
|
for($iterator = $otherDataset->listNamedGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
{
|
||||||
|
$current=$iterator->current();
|
||||||
|
$this->graphs[$current->getGraphName()]=$current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($otherDataset->hasDefaultGraph())
|
||||||
|
{
|
||||||
|
$this->defaultGraph = $this->defaultGraph->unite($otherDataset->getDefaultGraph());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Quad level methods ========================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a quad to the Dataset. The argument must not contain any
|
||||||
|
* wildcards. If the quad is already present, nothing happens. A new
|
||||||
|
* named graph will automatically be created if necessary.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function addQuad(&$quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();
|
||||||
|
if ($this->containsNamedGraph($graphName->getLabel())===false)
|
||||||
|
$this->createGraph($graphName->getLabel());
|
||||||
|
|
||||||
|
$this->graphs[$graphName->getLabel()]->add($quad->getStatement());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells wether the Dataset contains a quad or
|
||||||
|
* quads matching a pattern.
|
||||||
|
*
|
||||||
|
* @param Resource $graphName
|
||||||
|
* @param Resource $subject
|
||||||
|
* @param Resource $predicate
|
||||||
|
* @param Resource $object
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function containsQuad($graphName,$subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
if ($this->containsNamedGraph($graphName->getLabel())!==true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return ($this->graphs[$graphName->getLabel()]->findFirstMatchingStatement($subject,$predicate,$object)!=null);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
if ($graph->findFirstMatchingStatement($subject,$predicate,$object)!=null)
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a Quad from the RDF dataset.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
*/
|
||||||
|
function removeQuad($quad)
|
||||||
|
{
|
||||||
|
$graphName=$quad->getGraphName();
|
||||||
|
|
||||||
|
if($graphName!=null)
|
||||||
|
{
|
||||||
|
if ($this->containsNamedGraph($graphName->getLabel())!==true)
|
||||||
|
return;
|
||||||
|
|
||||||
|
return ($this->graphs[$graphName->getLabel()]->remove($quad->getStatement())!=null);
|
||||||
|
|
||||||
|
}
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
$graph->remove($quad->getStatement());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counts the Quads in the RDF dataset. Identical Triples in
|
||||||
|
* different NamedGraphs are counted individually.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function countQuads()
|
||||||
|
{
|
||||||
|
$count=0;
|
||||||
|
foreach ($this->graphs as $graph)
|
||||||
|
{
|
||||||
|
$count+=$graph->size();
|
||||||
|
}
|
||||||
|
return $count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a quad pattern. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resourceor Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @return Iterator
|
||||||
|
*/
|
||||||
|
function &findInNamedGraphs($graph,$subject,$predicate,$object,$returnAsTriples = false)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($graph!=null)
|
||||||
|
{
|
||||||
|
$findGraph=&$this->getNamedGraph($graph->getLabel());
|
||||||
|
if($findGraph==null)
|
||||||
|
$findGraph=new MemModel();
|
||||||
|
|
||||||
|
return $findGraph->iterFind($subject,$predicate,$object);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsMem.php';
|
||||||
|
$m = new IteratorFindQuadsMem($subject,$predicate,$object,$this->listNamedGraphs(),$returnAsTriples);
|
||||||
|
return $m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds Statements that match a pattern in the default Graph. The argument may contain
|
||||||
|
* wildcards.
|
||||||
|
*
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @param Resource or Null
|
||||||
|
* @return Iterator
|
||||||
|
*/
|
||||||
|
function &findInDefaultGraph($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
return $this->defaultGraph->iterFind($subject,$predicate,$object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// dataset Package
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Description : dataset package
|
||||||
|
//
|
||||||
|
// Author: Daniel Westphal <http://www.d-westphal.de>
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Include ResModel classes
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/DatasetMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/DatasetDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/Quad.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsMem.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsDb.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'syntax/TriXParser.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'syntax/TriXSerializer.php');
|
||||||
|
?>
|
||||||
@ -0,0 +1,127 @@
|
|||||||
|
<?php
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorAllGraphsDb
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a Graph iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used in a for-loop like:
|
||||||
|
* for($iterator = $dataset->listGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentResource=$iterator->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorAllGraphsDb
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated DB resultSet
|
||||||
|
* @var $dbResultSets ADODB result
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbResultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated datasetDb
|
||||||
|
* @var datasetDb
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $datasetDb;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current position
|
||||||
|
* @var integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $key;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current NamedGraph
|
||||||
|
* @var obejct NamedGraph
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $current;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param ADODBResultSet
|
||||||
|
* @param DatasetDb
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorAllGraphsDb(&$dbResultSet,&$datasetDb)
|
||||||
|
{
|
||||||
|
$this->dbResultSet=& $dbResultSet;
|
||||||
|
$this->datasetDb=& $datasetDb;
|
||||||
|
$this->current = $this->dbResultSet->fields[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
//not supported
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
return (!$this->dbResultSet->EOF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
$this->dbResultSet->moveNext();
|
||||||
|
$this->current = $this->dbResultSet->fields[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function ¤t()
|
||||||
|
{
|
||||||
|
return ($this->datasetDb->getNamedGraph($this->current));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->dbResultSet->_currentRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorAllGraphsMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a Graph iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used in a for-loop like:
|
||||||
|
* for($iterator = $dataset->listGraphs(); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentResource=$it->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorAllGraphsMem
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated RDF dataset
|
||||||
|
*
|
||||||
|
* @var object dataset
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $associatedGraphSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current position
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the current resource is valid
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current NamedGraph
|
||||||
|
*
|
||||||
|
* @var obejct NamedGraph
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $current;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param dataset
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorAllGraphsMem(&$namedGraphSet)
|
||||||
|
{
|
||||||
|
$this->associatedGraphSet=&$namedGraphSet;
|
||||||
|
$this->rewind();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
$this->key = -1;
|
||||||
|
$this->next();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
return $this->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
$this->current = &$this->associatedGraphSet->getGraphWithOffset(++$this->key);
|
||||||
|
$this->valid=($this->current!=NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function ¤t()
|
||||||
|
{
|
||||||
|
return $this->current;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,145 @@
|
|||||||
|
<?php
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorFindQuadsDb
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a quad iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used like:
|
||||||
|
* for($iterator = $dataset->findInNamedGraphs(null,null,null,null); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentQuad=$iterator->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorFindQuadsDb
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated DB resultSet.
|
||||||
|
*
|
||||||
|
* @var $dbResultSets ADODB result
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $dbResultSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds a reference to the associated datasetDb.
|
||||||
|
*
|
||||||
|
* @var $datasetDb datasetDb
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $datasetDb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* boolean value, if the results should be returned as triples.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $returnAsTriples;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param dataset
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorFindQuadsDb(&$dbResultSet,&$datasetDb,$returnAsTriples=false)
|
||||||
|
{
|
||||||
|
$this->dbResultSet=& $dbResultSet;
|
||||||
|
$this->datasetDb=& $datasetDb;
|
||||||
|
$this->returnAsTriples=$returnAsTriples;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
//not supported
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
if (($this->dbResultSet ===false) OR ($this->dbResultSet->EOF) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
if ($this->dbResultSet!==false)
|
||||||
|
$this->dbResultSet->moveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function ¤t()
|
||||||
|
{
|
||||||
|
if ($this->dbResultSet===false)
|
||||||
|
return null;
|
||||||
|
// subject
|
||||||
|
if ($this->dbResultSet->fields[5] == 'r')
|
||||||
|
$sub = new Resource($this->dbResultSet->fields[0]);
|
||||||
|
else
|
||||||
|
$sub = new BlankNode($this->dbResultSet->fields[0]);
|
||||||
|
|
||||||
|
// predicate
|
||||||
|
$pred = new Resource($this->dbResultSet->fields[1]);
|
||||||
|
|
||||||
|
// object
|
||||||
|
if ($this->dbResultSet->fields[6] == 'r')
|
||||||
|
$obj = new Resource($this->dbResultSet->fields[2]);
|
||||||
|
elseif ($this->dbResultSet->fields[6] == 'b')
|
||||||
|
$obj = new BlankNode($this->dbResultSet->fields[2]);
|
||||||
|
else {
|
||||||
|
$obj = new Literal($this->dbResultSet->fields[2], $this->dbResultSet->fields[3]);
|
||||||
|
if ($this->dbResultSet->fields[4])
|
||||||
|
$obj->setDatatype($this->dbResultSet->fields[4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->returnAsTriples)
|
||||||
|
return (new Statement($sub, $pred, $obj));
|
||||||
|
|
||||||
|
return (new Quad(new Resource($this->dbResultSet->fields[7]),$sub,$pred,$obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->dbResultSet->_currentRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,217 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'dataset/Quad.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: IteratorFindQuadsMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a quad iterator.
|
||||||
|
*
|
||||||
|
* This Iterator should be used like:
|
||||||
|
* for($iterator = $dataset->findInNamedGraphs(null,null,null,null); $iterator->valid(); $iterator->next())
|
||||||
|
* {
|
||||||
|
* $currentQuad=$it->current();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://d-westphal.de)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class IteratorFindQuadsMem
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* key value in the current graph.
|
||||||
|
*
|
||||||
|
* @var dataset
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* boolean value, if the results should be returned as triples.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $returnAsTriples;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current position.
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the current resource is valid.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current NamedGraph.
|
||||||
|
*
|
||||||
|
* @var NamedGraph
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $current;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The graphName Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findGraphName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The subject Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findSubject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The predicate Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findPredicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The object Resource to search for.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterator over all graphs of the RDF dataset.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphIterator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* $subject, $predicate, and $object are used like find().
|
||||||
|
* $getSPO supports the strings 's', 'p', and 'o' to return
|
||||||
|
* either the subject, predicate, or object of the result statements.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param dataset
|
||||||
|
* @param Boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function IteratorFindQuadsMem($subject,$predicate,$object,&$graphIterator, $returnAsTriples=false)
|
||||||
|
{
|
||||||
|
$this->findSubject=$subject;
|
||||||
|
$this->findPredicate=$predicate;
|
||||||
|
$this->findObject=$object;
|
||||||
|
$this->graphIterator=&$graphIterator;
|
||||||
|
$this->rewind();
|
||||||
|
$this->returnAsTriples=$returnAsTriples;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets iterator list to start.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function rewind()
|
||||||
|
{
|
||||||
|
$this->graphIterator->rewind();
|
||||||
|
$this->key = -1;
|
||||||
|
$this->graphKey=-1;
|
||||||
|
$this->next();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Says if there are additional items left in the list.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function valid()
|
||||||
|
{
|
||||||
|
return $this->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves Iterator to the next item in the list.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function next()
|
||||||
|
{
|
||||||
|
if($this->graphIterator->valid()===false)
|
||||||
|
{
|
||||||
|
$this->valid=false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentGraph=&$this->graphIterator->current();
|
||||||
|
$this->current= $currentGraph->findFirstMatchingStatement($this->findSubject,$this->findPredicate,$this->findObject,++$this->graphKey);
|
||||||
|
if($this->current==null)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$this->graphIterator->next();
|
||||||
|
if($this->graphIterator->valid()===false)
|
||||||
|
{
|
||||||
|
$this->valid=false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$currentGraph=&$this->graphIterator->current();
|
||||||
|
$this->graphKey=-1;
|
||||||
|
$this->current= $currentGraph->findFirstMatchingStatement($this->findSubject,$this->findPredicate,$this->findObject,++$this->graphKey);
|
||||||
|
|
||||||
|
} while ($this->current==null);
|
||||||
|
}
|
||||||
|
$this->key++;
|
||||||
|
$this->valid=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current item.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function current()
|
||||||
|
{
|
||||||
|
if($this->returnAsTriples) return $this->current;
|
||||||
|
|
||||||
|
$currentGraph=&$this->graphIterator->current();
|
||||||
|
return new Quad(new Resource($currentGraph->getGraphName()),$this->current->getSubject(),$this->current->getPredicate(),$this->current->getObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key of the current item.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function key()
|
||||||
|
{
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: NamedGraphDb
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent NamedGraph implementation that extends a {@link DbModel}.
|
||||||
|
* The graphName is not stored in the database. As soon as the namedGraph is added
|
||||||
|
* to a RDF dataset the graphName is saved.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class NamedGraphDb extends DbModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the NamedGraphDb
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* Do not call this directly.
|
||||||
|
* Use the method getModel,getNewModel or putModel of the Class NamedGraphDb instead.
|
||||||
|
*
|
||||||
|
* @param ADODBConnection
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function NamedGraphDb(&$dbConnection, $modelURI, $modelID,$graphName, $baseURI=NULL)
|
||||||
|
{
|
||||||
|
$this->dbConn =& $dbConnection;
|
||||||
|
$this->modelURI = $modelURI;
|
||||||
|
$this->modelID = $modelID;
|
||||||
|
$this->baseURI = $this->_checkBaseURI($baseURI);
|
||||||
|
$this->graphName = $graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graph name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setGraphName($graphName)
|
||||||
|
{
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the graph name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getGraphName()
|
||||||
|
{
|
||||||
|
return $this->graphName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
require_once RDFAPI_INCLUDE_DIR . 'model/MemModel.php';
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: NamedGraphMem
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NamedGraph implementation that extends a {@link MemModel}
|
||||||
|
* with a name.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <http://www.d-westphal.de>
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class NamedGraphMem extends MemModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the NamedGraphMem.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphName;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You have to supply a graph name. You can supply a URI.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function NamedGraphMem($graphName,$baseURI = null)
|
||||||
|
{
|
||||||
|
$this->setBaseURI($baseURI);
|
||||||
|
$this->indexed = INDEX_TYPE;
|
||||||
|
$this->setGraphName($graphName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graph name.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setGraphName($graphName)
|
||||||
|
{
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the graph name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getGraphName()
|
||||||
|
{
|
||||||
|
return $this->graphName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,147 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: Quad
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* A Triple in a RDF dataset, consisting of four Jena Nodes: graphName,
|
||||||
|
* subject, predicate, and object.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal (http://www.d-westphal.de)
|
||||||
|
*
|
||||||
|
* @package dataset
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
class Quad
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the NamedGraphMem.
|
||||||
|
*
|
||||||
|
* @var Resource
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $graphName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Statement
|
||||||
|
*
|
||||||
|
* @var Statement
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $statement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* Creates a Quad from four Nodes.
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @param Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function Quad($graphName,$subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
if (!is_a($graphName, 'Resource'))
|
||||||
|
{
|
||||||
|
$errmsg = RDFAPI_ERROR .
|
||||||
|
'(class: Quad; method: new): Resource expected as graphName.';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
$this->statement=new Statement($subject,$predicate,$object);
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graph name.
|
||||||
|
*
|
||||||
|
* @param Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function setGraphName($graphName)
|
||||||
|
{
|
||||||
|
$this->graphName=$graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the graph name.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getGraphName()
|
||||||
|
{
|
||||||
|
return $this->graphName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a human-readable (sort of) string "graphname { s p o . }"
|
||||||
|
* describing the quad.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toString()
|
||||||
|
{
|
||||||
|
return 'GraphName('.$this->graphName->getLabel().') '.$this->statement->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the subject.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getSubject()
|
||||||
|
{
|
||||||
|
return $this->statement->getSubject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the predicate.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getPredicate()
|
||||||
|
{
|
||||||
|
return $this->statement->getPredicate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the object.
|
||||||
|
*
|
||||||
|
* @return Resource
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getObject()
|
||||||
|
{
|
||||||
|
return $this->statement->getObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the statement(subject,predicate,object).
|
||||||
|
*
|
||||||
|
* @return statement
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getStatement()
|
||||||
|
{
|
||||||
|
return $this->statement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if two quads are equal.
|
||||||
|
*
|
||||||
|
* @param Quad
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function equals($quad)
|
||||||
|
{
|
||||||
|
return ($this->graphName->equals($quad->getGraphName()) && $this->statement->equals($quad->getStatement()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 62
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/320/trunk/rdfapi-php/api/infModel
|
||||||
|
END
|
||||||
|
InfModel.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 75
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/infModel/InfModel.php
|
||||||
|
END
|
||||||
|
InfModelP.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 76
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/268/trunk/rdfapi-php/api/infModel/InfModelP.php
|
||||||
|
END
|
||||||
|
InfModelB.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 76
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/infModel/InfModelB.php
|
||||||
|
END
|
||||||
|
InfStatement.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 79
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/268/trunk/rdfapi-php/api/infModel/InfStatement.php
|
||||||
|
END
|
||||||
|
InfModelF.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 76
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/320/trunk/rdfapi-php/api/infModel/InfModelF.php
|
||||||
|
END
|
||||||
|
InfRule.php
|
||||||
|
K 25
|
||||||
|
svn:wc:ra_dav:version-url
|
||||||
|
V 74
|
||||||
|
/svnroot/rdfapi-php/!svn/ver/290/trunk/rdfapi-php/api/infModel/InfRule.php
|
||||||
|
END
|
||||||
@ -0,0 +1,106 @@
|
|||||||
|
8
|
||||||
|
|
||||||
|
dir
|
||||||
|
556
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php/trunk/rdfapi-php/api/infModel
|
||||||
|
https://rdfapi-php.svn.sourceforge.net/svnroot/rdfapi-php
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2006-11-21T09:38:51.000000Z
|
||||||
|
320
|
||||||
|
tgauss
|
||||||
|
|
||||||
|
|
||||||
|
svn:special svn:externals svn:needs-lock
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
b2ee660e-c932-0410-bdee-d8da4d8102f4
|
||||||
|
|
||||||
|
InfModel.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:49.005834Z
|
||||||
|
26bcd3c49686d1c8a402b9b1ff0e128e
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
InfModelP.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:49.005834Z
|
||||||
|
e4eb63f504856523cd9460c7cdb887b1
|
||||||
|
2006-05-15T05:28:09.000000Z
|
||||||
|
268
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
InfModelB.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:49.021455Z
|
||||||
|
554810af03fa02dfef1b3fcbb9d36fa8
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
InfStatement.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:49.021455Z
|
||||||
|
b3b8db445eadddd525f88944aec533f4
|
||||||
|
2006-05-15T05:28:09.000000Z
|
||||||
|
268
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
InfModelF.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:49.037075Z
|
||||||
|
20031867ebe5ea70c133653f9651138b
|
||||||
|
2006-11-21T09:38:51.000000Z
|
||||||
|
320
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
|
InfRule.php
|
||||||
|
file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2008-02-29T14:57:49.037075Z
|
||||||
|
caccf06491e8ba11a7f213807c311046
|
||||||
|
2006-06-22T12:23:24.000000Z
|
||||||
|
290
|
||||||
|
tgauss
|
||||||
|
has-props
|
||||||
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
8
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
K 13
|
||||||
|
svn:eol-style
|
||||||
|
V 6
|
||||||
|
native
|
||||||
|
K 12
|
||||||
|
svn:keywords
|
||||||
|
V 23
|
||||||
|
Author Date Id Revision
|
||||||
|
END
|
||||||
@ -0,0 +1,678 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: infModel
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A InfModel Model extends a MemModel , by adding the ability to infer statements from
|
||||||
|
* known statements and RDFS/OWL-Schematas.
|
||||||
|
* It uses the same interface as MemModel, thus making the
|
||||||
|
* infererence process hidden.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
|
||||||
|
class InfModel extends MemModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Array that holds the objects of the class Infrule,
|
||||||
|
* which were assigned by the _addToInference() function
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infRules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of URI-Strings that produces Infrules.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $supportedInference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of the connection between the infrules and the statement
|
||||||
|
* that assigned those rules.
|
||||||
|
* array[2][3]=true;array[2][5]=true means, that statement 2
|
||||||
|
* assigned rule 3 & 5 to the model.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $statementRuleIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of the infRule triggers and the matching infrules.
|
||||||
|
* $this->infRulesTriggerIndex['s'] for subject index, ['p'] for predicates,
|
||||||
|
* and ['o'] for objects.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infRulesTriggerIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of the infRule entailments and the matching infrules.
|
||||||
|
* $this->infRulesEntailIndex['s'] for subject index, ['p'] for predicates,
|
||||||
|
* and ['o'] for objects.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infRulesEntailIndex;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a base_uri
|
||||||
|
*
|
||||||
|
* @param string $baseURI
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function InfModel ($baseURI = NULL)
|
||||||
|
{
|
||||||
|
//call the memmodel constructor method
|
||||||
|
parent::MemModel($baseURI);
|
||||||
|
//initialise vars
|
||||||
|
$this->infRulesTriggerIndex['s']=array();
|
||||||
|
$this->infRulesTriggerIndex['p']=array();
|
||||||
|
$this->infRulesTriggerIndex['o']=array();
|
||||||
|
$this->infRulesEntailIndex['s']=array();
|
||||||
|
$this->infRulesEntailIndex['p']=array();
|
||||||
|
$this->infRulesEntailIndex['o']=array();
|
||||||
|
$this->infRules=array();
|
||||||
|
$this->statementRuleIndex = array();
|
||||||
|
//arraylist of predicate labels that shall add inference rules
|
||||||
|
//to the model
|
||||||
|
//The constants, wich statements will create rules can be configured in constants.php
|
||||||
|
if (INF_RES_SUBCLASSOF)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_SUBCLASSOF;
|
||||||
|
|
||||||
|
if (INF_RES_SUBPROPERTYOF)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF;
|
||||||
|
|
||||||
|
if (INF_RES_RANGE)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_RANGE;
|
||||||
|
|
||||||
|
if (INF_RES_DOMAIN)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_DOMAIN;
|
||||||
|
|
||||||
|
if (INF_RES_OWL_SAMEAS)
|
||||||
|
$this->supportedInference[] = OWL_URI.OWL_SAME_AS;
|
||||||
|
|
||||||
|
if (INF_RES_OWL_INVERSEOF)
|
||||||
|
$this->supportedInference[] = OWL_URI.OWL_INVERSE_OF;
|
||||||
|
|
||||||
|
//Rule: rdfs12
|
||||||
|
if (INF_RES_RULE_RDFS12)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.'ContainerMembershipProperty'));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF),new Resource(RDF_SCHEMA_URI.'member'));
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs6
|
||||||
|
if (INF_RES_RULE_RDFS6)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_NAMESPACE_URI.RDF_PROPERTY));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF),'<s>');
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs8
|
||||||
|
if (INF_RES_RULE_RDFS8)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.RDFS_CLASS));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBCLASSOF),new Resource(RDF_SCHEMA_URI.RDFS_RESOURCE));
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs10
|
||||||
|
if (INF_RES_RULE_RDFS10)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.RDFS_CLASS));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBCLASSOF),'<s>');
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs13
|
||||||
|
if (INF_RES_RULE_RDFS13)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.RDFS_DATATYPE));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBCLASSOF),new Resource(RDF_SCHEMA_URI.RDFS_LITERAL));
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new triple to the Model without checking if the statement
|
||||||
|
* is already in the Model.
|
||||||
|
* So if you want a duplicate free MemModel use the addWithoutDuplicates()
|
||||||
|
* function (which is slower then add())
|
||||||
|
* If the statement's predicate label is supported by the inference,
|
||||||
|
* the matching rules are added.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function add($statement)
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//if the predicate is supported by the inference
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
{
|
||||||
|
$this->_addToInference($statement);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function analyses the statement's predicate and adds the
|
||||||
|
* matching infrule to the model.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _addToInference($statement)
|
||||||
|
{
|
||||||
|
$predicateLabel=$statement->getLabelPredicate();
|
||||||
|
//get the position of the the statement in the model
|
||||||
|
end($this->triples);
|
||||||
|
$statementPosition=key($this->triples);
|
||||||
|
|
||||||
|
switch ($predicateLabel)
|
||||||
|
{
|
||||||
|
case RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF :
|
||||||
|
//create a new rule
|
||||||
|
$infRule=new InfRule();
|
||||||
|
//set the trigger to match all statements, having a
|
||||||
|
//predicate, that matches the subject of the statement that
|
||||||
|
//created this rule.
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
//set the infrule to return a statement, having the same
|
||||||
|
//subject and object as the statement, that asked for an
|
||||||
|
//entailment, and having the object of the statement,
|
||||||
|
//that created this rule as predicate.
|
||||||
|
$infRule->setEntailment('<s>',$statement->getObject(),'<o>');
|
||||||
|
//add the infule to Model, Statement/Rule-Index,
|
||||||
|
//and Rule/Trigger (or Rule/Entailment) index
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDF_SCHEMA_URI.RDFS_SUBCLASSOF :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getSubject());
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getObject());
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDF_SCHEMA_URI.RDFS_DOMAIN :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getObject());
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDF_SCHEMA_URI.RDFS_RANGE :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<o>',new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getObject());
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWL_URI.OWL_INVERSE_OF :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<o>',$statement->getObject(),'<s>');
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getObject(),null);
|
||||||
|
$infRule->setEntailment('<o>',$statement->getSubject(),'<s>');
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWL_URI.OWL_SAME_AS :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger($statement->getSubject(),null,null);
|
||||||
|
$infRule->setEntailment($statement->getObject(),'<p>','<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger($statement->getObject(),null,null);
|
||||||
|
$infRule->setEntailment($statement->getSubject(),'<p>','<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<s>',$statement->getObject(),'<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getObject(),null);
|
||||||
|
$infRule->setEntailment('<s>',$statement->getSubject(),'<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,null,$statement->getSubject());
|
||||||
|
$infRule->setEntailment('<s>','<p>',$statement->getObject());
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,null,$statement->getObject());
|
||||||
|
$infRule->setEntailment('<s>','<p>',$statement->getSubject());
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function checks, which infrules were added by the statement and
|
||||||
|
* removes those.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _removeFromInference($statement)
|
||||||
|
{
|
||||||
|
$return= array();
|
||||||
|
$statementPosition=-1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//get the position of the statement that should be removed
|
||||||
|
$statementPosition=$this->findFirstMatchOff($statement->getSubject(),
|
||||||
|
$statement->getPredicate(),
|
||||||
|
$statement->getObject(),
|
||||||
|
$statementPosition+1);
|
||||||
|
if ($statementPosition!=-1)
|
||||||
|
{
|
||||||
|
//if it added any rules
|
||||||
|
if (isset ($this->statementRuleIndex[$statementPosition]))
|
||||||
|
{
|
||||||
|
//remove all rules
|
||||||
|
foreach ($this->statementRuleIndex[$statementPosition] as $key => $value)
|
||||||
|
{
|
||||||
|
//remove from Rule-Trigger Index
|
||||||
|
if (is_a($this,'InfModelF'))
|
||||||
|
{
|
||||||
|
$trigger=$this->infRules[$key]->getTrigger();
|
||||||
|
|
||||||
|
if(is_a($trigger['s'],'Node'))
|
||||||
|
{
|
||||||
|
$subjectLabel=$trigger['s']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$subjectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesTriggerIndex['s'][$subjectLabel][array_search($key,$this->infRulesTriggerIndex['s'][$subjectLabel])]);
|
||||||
|
|
||||||
|
if(is_a($trigger['p'],'Node'))
|
||||||
|
{
|
||||||
|
$predicateLabel=$trigger['p']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$predicateLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesTriggerIndex['p'][$predicateLabel][array_search($key,$this->infRulesTriggerIndex['p'][$predicateLabel])]);
|
||||||
|
|
||||||
|
if(is_a($trigger['o'],'Node'))
|
||||||
|
{
|
||||||
|
$objectLabel=$trigger['o']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$objectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesTriggerIndex['o'][$objectLabel][array_search($key,$this->infRulesTriggerIndex['o'][$objectLabel])]);
|
||||||
|
} else
|
||||||
|
//remove from Rule-Entailment Index
|
||||||
|
{
|
||||||
|
$entailment=$this->infRules[$key]->getEntailment();
|
||||||
|
|
||||||
|
if(is_a($entailment['s'],'Node'))
|
||||||
|
{
|
||||||
|
$subjectLabel=$entailment['s']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$subjectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesEntailIndex['s'][$subjectLabel][array_search($key,$this->infRulesEntailIndex['s'][$subjectLabel])]);
|
||||||
|
|
||||||
|
|
||||||
|
if(is_a($entailment['p'],'Node'))
|
||||||
|
{
|
||||||
|
$predicateLabel=$entailment['p']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$predicateLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesEntailIndex['p'][$predicateLabel][array_search($key,$this->infRulesEntailIndex['p'][$predicateLabel])]);
|
||||||
|
|
||||||
|
if(is_a($entailment['o'],'Node'))
|
||||||
|
{
|
||||||
|
$objectLabel=$entailment['o']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$objectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesEntailIndex['o'][$objectLabel][array_search($key,$this->infRulesEntailIndex['o'][$objectLabel])]);
|
||||||
|
}
|
||||||
|
//remove from statement-Rule Index
|
||||||
|
unset ($this->infRules[$key]);
|
||||||
|
}
|
||||||
|
unset($this->statementRuleIndex[$statementPosition]);
|
||||||
|
$return[]=$statementPosition;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
} while($statementPosition!=-1);
|
||||||
|
|
||||||
|
//return the positions of the statements to be removed OR emty array
|
||||||
|
//if nothing was found.
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a model, containing all Statements, having a Predicate, that
|
||||||
|
* is supported by the inference.
|
||||||
|
*
|
||||||
|
* @return object Model
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getSchema()
|
||||||
|
{
|
||||||
|
$res=new MemModel();
|
||||||
|
//Search the base-model for all statements, having a Predicate, that
|
||||||
|
//is supported by the inference.
|
||||||
|
foreach ($this->supportedInference as $inferencePredicateLabel)
|
||||||
|
{
|
||||||
|
$res->addModel($this->find(null, new Resource($inferencePredicateLabel), null));
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* General method to replace nodes of a MemModel.
|
||||||
|
* This function is disabled in the Inference Model.
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @param object Node $replacement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function replace($subject, $predicate, $object, $replacement)
|
||||||
|
{
|
||||||
|
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModel; method: replace): This function is disabled in the Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to search for triples using Perl-style regular expressions.
|
||||||
|
* NULL input for any parameter will match anything.
|
||||||
|
* Example: $result = $m->find_regex( NULL, NULL, $regex );
|
||||||
|
* Finds all triples where the label of the object node matches the regular
|
||||||
|
* expression.
|
||||||
|
* Returns an empty MemModel if nothing is found.
|
||||||
|
*
|
||||||
|
* This function is disabled in the Inference Model
|
||||||
|
*
|
||||||
|
* @param string $subject_regex
|
||||||
|
* @param string $predicate_regex
|
||||||
|
* @param string $object_regex
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function findRegex($subject_regex, $predicate_regex, $object_regex)
|
||||||
|
{
|
||||||
|
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModel; method: findRegex):
|
||||||
|
This function is disabled in the
|
||||||
|
Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all tripels of a certain vocabulary.
|
||||||
|
* $vocabulary is the namespace of the vocabulary inluding a # : / char at
|
||||||
|
* the end.
|
||||||
|
* e.g. http://www.w3.org/2000/01/rdf-schema#
|
||||||
|
* Returns an empty MemModel if nothing is found.
|
||||||
|
*
|
||||||
|
* This function is disabled in the Inference Model.
|
||||||
|
*
|
||||||
|
* @param string $vocabulary
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function findVocabulary($vocabulary)
|
||||||
|
{
|
||||||
|
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModel; method: findVocabulary):
|
||||||
|
This function is disabled in the
|
||||||
|
Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the URI or NULL to the Infrule trigger or entailment index.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object infrule $infRule
|
||||||
|
* @param integer $infRulePosition
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _addInfruleToIndex(& $infRule,& $infRulePosition)
|
||||||
|
{
|
||||||
|
//Add the rule only to the trigger index, if it is a InfFModel
|
||||||
|
if (is_a($this,'InfModelF'))
|
||||||
|
{
|
||||||
|
//get the trigger
|
||||||
|
$trigger = $infRule->getTrigger();
|
||||||
|
//evaluate and set the index
|
||||||
|
if ($trigger['s'] == null)
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['s']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['s'][$trigger['s']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($trigger['p'] == null)
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['p']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['p'][$trigger['p']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($trigger['o'] == null)
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['o']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['o'][$trigger['o']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
} else
|
||||||
|
//add to entailment Index if it is a BModel
|
||||||
|
{
|
||||||
|
//get the entailment
|
||||||
|
$entailment = $infRule->getEntailment();
|
||||||
|
//evaluate the entailment and add to index
|
||||||
|
if (!is_a($entailment['s'],'Node'))
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['s']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['s'][$entailment['s']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!is_a($entailment['p'],'Node'))
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['p']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['p'][$entailment['p']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!is_a($entailment['o'],'Node'))
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['o']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['o'][$entailment['o']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the trigger-index for a matching trigger and returns an
|
||||||
|
* array of infRule positions.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object infrule $infRule
|
||||||
|
* @return array integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _findRuleTriggerInIndex($statement)
|
||||||
|
{
|
||||||
|
$return=array();
|
||||||
|
//a statement's subject matches all triggers with null and the same URI
|
||||||
|
$subjectLabel=$statement->getLabelSubject();
|
||||||
|
$inIndexS=array();
|
||||||
|
if (isset($this->infRulesTriggerIndex['s']['null']))
|
||||||
|
$inIndexS=array_values($this->infRulesTriggerIndex['s']['null']);
|
||||||
|
if (isset($this->infRulesTriggerIndex['s'][$subjectLabel]))
|
||||||
|
$inIndexS= array_merge($inIndexS,array_values($this->infRulesTriggerIndex['s'][$subjectLabel]));
|
||||||
|
|
||||||
|
//a statement's predicate matches all triggers with null and the same URI
|
||||||
|
$predicateLabel=$statement->getLabelPredicate();
|
||||||
|
$inIndexP=array();
|
||||||
|
if (isset($this->infRulesTriggerIndex['p']['null']))
|
||||||
|
$inIndexP=array_values($this->infRulesTriggerIndex['p']['null']);
|
||||||
|
if (isset($this->infRulesTriggerIndex['p'][$predicateLabel]))
|
||||||
|
$inIndexP= array_merge($inIndexP,array_values($this->infRulesTriggerIndex['p'][$predicateLabel]));
|
||||||
|
|
||||||
|
//a statement's object matches all triggers with null and the same URI
|
||||||
|
$objectLabel=$statement->getLabelObject();
|
||||||
|
$inIndexO=array();
|
||||||
|
if (isset($this->infRulesTriggerIndex['o']['null']))
|
||||||
|
$inIndexO=array_values($this->infRulesTriggerIndex['o']['null']);
|
||||||
|
if (isset($this->infRulesTriggerIndex['o'][$objectLabel]))
|
||||||
|
$inIndexO= array_merge($inIndexO,array_values($this->infRulesTriggerIndex['o'][$objectLabel]));
|
||||||
|
|
||||||
|
//if an infrule position occurs in subject, predicate, and object index, add to result array.
|
||||||
|
foreach ($inIndexP as $positionP)
|
||||||
|
{
|
||||||
|
if (in_array($positionP,$inIndexO))
|
||||||
|
if (in_array($positionP,$inIndexS))
|
||||||
|
$return[]=$positionP;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the Entailment-index for a matching Entailment and returns an
|
||||||
|
* array of infRule positions.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param node or null $subject
|
||||||
|
* @param node or null $predicate
|
||||||
|
* @param node or null $object
|
||||||
|
* @return array integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _findRuleEntailmentInIndex($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
$return=array();
|
||||||
|
//a node matches all entailments with NULL or a matching URI
|
||||||
|
if(is_a($subject,'Node'))
|
||||||
|
{
|
||||||
|
$subjectLabel=$subject->getLabel();
|
||||||
|
$inIndexS=array();
|
||||||
|
if (isset($this->infRulesEntailIndex['s']['null'])) $inIndexS=array_values($this->infRulesEntailIndex['s']['null']);
|
||||||
|
if (isset($this->infRulesEntailIndex['s'][$subjectLabel])) $inIndexS= array_merge($inIndexS,array_values($this->infRulesEntailIndex['s'][$subjectLabel]));
|
||||||
|
} else
|
||||||
|
//if the subject search pattern is NULL, every rule will match the subject search patter
|
||||||
|
{
|
||||||
|
$inIndexS=array_keys($this->infRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_a($predicate,'Node'))
|
||||||
|
{
|
||||||
|
$predicateLabel=$predicate->getLabel();
|
||||||
|
$inIndexP=array();
|
||||||
|
if (isset($this->infRulesEntailIndex['p']['null'])) $inIndexP=array_values($this->infRulesEntailIndex['p']['null']);
|
||||||
|
if (isset($this->infRulesEntailIndex['p'][$predicateLabel])) $inIndexP= array_merge($inIndexP,array_values($this->infRulesEntailIndex['p'][$predicateLabel]));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$inIndexP=array_keys($this->infRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_a($object,'Node'))
|
||||||
|
{
|
||||||
|
$objectLabel=$object->getLabel();
|
||||||
|
$inIndexO=array();
|
||||||
|
if (isset($this->infRulesEntailIndex['o']['null'])) $inIndexO=array_values($this->infRulesEntailIndex['o']['null']);
|
||||||
|
if (isset($this->infRulesEntailIndex['o'][$objectLabel])) $inIndexO= array_merge($inIndexO,array_values($this->infRulesEntailIndex['o'][$objectLabel]));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$inIndexO=array_keys($this->infRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
//if an infrule position occurs in subject, predicate, and object index, add to result array.
|
||||||
|
foreach ($inIndexP as $positionP)
|
||||||
|
{
|
||||||
|
if (in_array($positionP,$inIndexO))
|
||||||
|
if (in_array($positionP,$inIndexS))
|
||||||
|
$return[]=$positionP;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an InfRule to the InfModel.
|
||||||
|
* $statementPosition states the positiion of the statement, that created
|
||||||
|
* this rule, in the model->triples array.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object Infrule $infRule
|
||||||
|
* @param integer $statementPosition
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _addInfRule($infRule, $statementPosition)
|
||||||
|
{
|
||||||
|
//add the rule
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
//get the position of the added rule in the model
|
||||||
|
end($this->infRules);
|
||||||
|
$rulePosition=key($this->infRules);
|
||||||
|
//add the information to the index, that this statement
|
||||||
|
//added this rule.
|
||||||
|
$this->statementRuleIndex[$statementPosition][$rulePosition]=true;
|
||||||
|
//add informations to index over trigger & entailment
|
||||||
|
$this->_addInfruleToIndex($infRule,$rulePosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,515 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfModelB
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A InfModelB extends the InfModel Class, with a backward chaining algorithm.
|
||||||
|
* Only the loaded or added base-triples are stored.
|
||||||
|
* A find-query evaluates the inference rules and recursively tries to find the statements.
|
||||||
|
* InfModelB memorises "Dead-Ends" until the next add() command, thus
|
||||||
|
* makin a second find much faster.
|
||||||
|
* InfModelB is safe for loops in Ontologies, that would cause infinite loops.
|
||||||
|
* WARNING: A find(null,null,null) might take very long.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class InfModelB extends InfModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array that holds combinations of inference rules with distinct
|
||||||
|
* find-querys, that don't lead to any inference.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findDeadEnds;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a base_uri
|
||||||
|
*
|
||||||
|
* @param string $baseURI
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function InfModelB($baseURI = null)
|
||||||
|
{
|
||||||
|
parent::InfModel($baseURI);
|
||||||
|
$this->findDeadEnds=array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new triple to the Model without checking, if the statement
|
||||||
|
* is already in the Model. So if you want a duplicate free Model use
|
||||||
|
* the addWithoutDuplicates() function (which is slower then add())
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function add($statement)
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//Reset the found dead-ends.
|
||||||
|
$this->findDeadEnds=array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* General method to search for triples.
|
||||||
|
* NULL input for any parameter will match anything.
|
||||||
|
* Example: $result = $m->find( NULL, NULL, $node );
|
||||||
|
* Finds all triples with $node as object.
|
||||||
|
* Returns an empty MemModel if nothing is found.
|
||||||
|
* To improve the search speed with big Models, call index(INDEX_TYPE)
|
||||||
|
* before seaching.
|
||||||
|
*
|
||||||
|
* It recursively searches in the statements and rules to find
|
||||||
|
* matching statements.
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function find($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
$searchStringIndex=array();
|
||||||
|
$resultModel=new MemModel();
|
||||||
|
|
||||||
|
//add all infered statements without duplicates to the result model
|
||||||
|
foreach ($this->_infFind($subject,$predicate,$object,array())as $statement)
|
||||||
|
{
|
||||||
|
$resultModel->addWithoutDuplicates($statement);
|
||||||
|
};
|
||||||
|
return $resultModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the main inference method of the InfModelB
|
||||||
|
* The algorithm works as follows:
|
||||||
|
* Find all statements in the base model, that matches the current
|
||||||
|
* find-query.
|
||||||
|
* Check all rules, if they are able to deliver infered statements,
|
||||||
|
* that match the current find-query. Don't use rules with queries,
|
||||||
|
* that lead to dead-ends and don't use a rule-query-combination that
|
||||||
|
* was used before in this branch (ontology loops).
|
||||||
|
* If a rule is possible do deliver such statements, get a new
|
||||||
|
* find-query, that is possible to find those statements, that are able
|
||||||
|
* to trigger this rule.
|
||||||
|
* Call this _infFind method wirh the new find-query and entail the
|
||||||
|
* resulting statements.
|
||||||
|
* If this rule, wasn't able to return any statements with this distinct
|
||||||
|
* query, add this combination to the dead-ends.
|
||||||
|
* Return the statements from the base triples and those, which were infered.
|
||||||
|
*
|
||||||
|
* If $findOnlyFirstMatching is set to true, only the first match in
|
||||||
|
* the base-statements is entailed an returned (used in contains() and
|
||||||
|
* findFirstMatchingStatement() methods).
|
||||||
|
*
|
||||||
|
* You can set an offset to look for the first matching statement by setting the
|
||||||
|
* $offset var.
|
||||||
|
*
|
||||||
|
* It recursively searches in the statements and rules to find matching
|
||||||
|
* statements
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @param array $searchStringIndex
|
||||||
|
* @param boolean $findOnlyFirstMatching
|
||||||
|
* @param integer $offset
|
||||||
|
* @param integer $resultCount
|
||||||
|
* @return object array Statements
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _infFind ($subject,$predicate,$object, $searchStringIndex, $findOnlyFirstMatching = false, $offset = 0,$resultCount = 0 )
|
||||||
|
{
|
||||||
|
$return=array();
|
||||||
|
//Find all matching statements in the base statements
|
||||||
|
$findResult=parent::find($subject,$predicate,$object);
|
||||||
|
//For all found statements
|
||||||
|
foreach ($findResult->triples as $statement)
|
||||||
|
{
|
||||||
|
$return[]=$statement;
|
||||||
|
$resultCount++;
|
||||||
|
|
||||||
|
//Return, if only the firstMatchingStatement was wanted
|
||||||
|
if ($findOnlyFirstMatching && $resultCount > $offset)
|
||||||
|
return $return;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Don't infer statements about the schema (rdfs:subClass, etc..)
|
||||||
|
//is false
|
||||||
|
if ($predicate == null ||
|
||||||
|
(is_a($predicate,'Node') &&
|
||||||
|
!in_array($predicate->getLabel(),$this->supportedInference))
|
||||||
|
)
|
||||||
|
//Check only Rules, that the EntailmentIndex returned.
|
||||||
|
foreach ($this->_findRuleEntailmentInIndex($subject,$predicate,$object) as $ruleKey)
|
||||||
|
{
|
||||||
|
$infRule=$this->infRules[$ruleKey];
|
||||||
|
$serializedRuleStatement=$ruleKey.serialize($subject).serialize($predicate).serialize($object);
|
||||||
|
//If it is to ontology loop and no dead-end
|
||||||
|
if (!in_array($serializedRuleStatement, $searchStringIndex) &&
|
||||||
|
!in_array($serializedRuleStatement, $this->findDeadEnds))
|
||||||
|
{
|
||||||
|
//Keep this distinct rule query cobination for
|
||||||
|
//this branch to detect loops
|
||||||
|
$searchStringIndex[]=$serializedRuleStatement;
|
||||||
|
|
||||||
|
//If the rule is able to deliver statements that match
|
||||||
|
//this query
|
||||||
|
if ($infRule->checkEntailment($subject,$predicate,$object))
|
||||||
|
{
|
||||||
|
//Get a modified find-query, that matches statements,
|
||||||
|
//that trigger this rule
|
||||||
|
$modefiedFind=$infRule->getModifiedFind($subject,$predicate,$object);
|
||||||
|
//Call this method with the new find-query
|
||||||
|
$infFindResult=$this->_infFind($modefiedFind['s'],
|
||||||
|
$modefiedFind['p'],
|
||||||
|
$modefiedFind['o'],
|
||||||
|
$searchStringIndex,
|
||||||
|
$findOnlyFirstMatching,
|
||||||
|
$offset,
|
||||||
|
$resultCount) ;
|
||||||
|
//If it deliverd statements that matches the trigger
|
||||||
|
if (isset($infFindResult[0]))
|
||||||
|
{
|
||||||
|
foreach ($infFindResult as $statement)
|
||||||
|
{
|
||||||
|
//Entail the statements and check, if they are not about the
|
||||||
|
//ontology
|
||||||
|
$newStatement=$infRule->entail($statement);
|
||||||
|
if (!in_array($newStatement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
//Check if, the entailed statements are, what we are looking for
|
||||||
|
if($this->_nodeEqualsFind($subject,$newStatement->getSubject()) &&
|
||||||
|
$this->_nodeEqualsFind($predicate,$newStatement->getPredicate()) &&
|
||||||
|
$this->_nodeEqualsFind($object,$newStatement->getObject() ) )
|
||||||
|
{
|
||||||
|
//Add to results
|
||||||
|
$return[]=$newStatement;
|
||||||
|
$resultCount++;
|
||||||
|
|
||||||
|
//or return at once
|
||||||
|
if ($findOnlyFirstMatching && $resultCount > $offset)
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
//If there were no results of the rule-query-combination,
|
||||||
|
//mark this combination as a dead-end.
|
||||||
|
$this->findDeadEnds[]=$serializedRuleStatement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Return the array of the found statements
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if the Model contains the given triple.
|
||||||
|
* TRUE if the triple belongs to the Model;
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @param object Statement &$statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function contains(&$statement)
|
||||||
|
{
|
||||||
|
//throws an error, if $statement is not of class Statement
|
||||||
|
if(!is_a($statement,'Statement'))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: InfModelB; method: contains):
|
||||||
|
$statement has to be object of class Statement', E_USER_ERROR);
|
||||||
|
|
||||||
|
//Call the _infFind method, but let it stop, if it finds the first match.
|
||||||
|
if (count( $this->_infFind($statement->getSubject(),
|
||||||
|
$statement->getPredicate(),
|
||||||
|
$statement->getObject(),
|
||||||
|
array(),true) ) >0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches for triples and returns the first matching statement.
|
||||||
|
* NULL input for any parameter will match anything.
|
||||||
|
* Example: $result = $m->findFirstMatchingStatement( NULL, NULL, $node );
|
||||||
|
* Returns the first statement of the MemModel where the object equals $node.
|
||||||
|
* Returns an NULL if nothing is found.
|
||||||
|
* You can define an offset to search for. Default = 0
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @param integer $offset
|
||||||
|
* @return object Statement
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function findFirstMatchingStatement($subject, $predicate, $object, $offset = 0)
|
||||||
|
{
|
||||||
|
//Call the _infFind method, but let it stop, if it finds the
|
||||||
|
//first match.
|
||||||
|
$res= $this->_infFind($subject,$predicate,$object,array(),true,$offset);
|
||||||
|
|
||||||
|
if (isset($res[$offset]))
|
||||||
|
{
|
||||||
|
return $res[$offset];
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a StatementIterator for traversing the Model.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object StatementIterator
|
||||||
|
*/
|
||||||
|
function & getStatementIterator()
|
||||||
|
{
|
||||||
|
// Import Package Utility
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_UTILITY);
|
||||||
|
// Gets a MemModel by executing a find(null,null,null) to get a
|
||||||
|
//inferable statements.
|
||||||
|
// WARNING: might be slow
|
||||||
|
return new StatementIterator($this->getMemModel());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of all inferable triples in the Model.
|
||||||
|
* WARNING: uses a find(null,null,null) to find all statements! (might take a while)
|
||||||
|
*
|
||||||
|
* @param boolean
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function size()
|
||||||
|
{
|
||||||
|
// Gets a MemModel by executing a find(null,null,null) to get a
|
||||||
|
//inferable statements.
|
||||||
|
// WARNING: might be slow
|
||||||
|
$res = $this->getMemModel();
|
||||||
|
return $res->size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing all the triples (including inferred
|
||||||
|
* statements) of the current InfModelB.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function & getMemModel()
|
||||||
|
{
|
||||||
|
|
||||||
|
$return=$this->find(null,null,null);
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
$return->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing only the base triples (without inferred
|
||||||
|
* statements) of the current InfModelB.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function & getBaseMemModel()
|
||||||
|
{
|
||||||
|
$return= new MemModel();
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
foreach ($this->triples as $statement)
|
||||||
|
$return->add($statement);
|
||||||
|
|
||||||
|
$retun->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short Dump of the InfModelB.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toString()
|
||||||
|
{
|
||||||
|
return 'InfModelB[baseURI=' . $this->getBaseURI() . '; size=' . $this->size(true) . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps of the InfModelB including ALL inferable triples.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toStringIncludingTriples()
|
||||||
|
{
|
||||||
|
$dump = $this->toString() . chr(13);
|
||||||
|
$stateIt=new StatementIterator($this->find(null,null,null));
|
||||||
|
while($statement=$stateIt->next())
|
||||||
|
{
|
||||||
|
$dump .= $statement->toString() . chr(13);
|
||||||
|
}
|
||||||
|
return $dump;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the RDF,N3 or N-Triple serialization of the full InfModelB
|
||||||
|
* (including inferred triples) to a file.
|
||||||
|
* You can decide to which format the model should be serialized by
|
||||||
|
* using a corresponding suffix-string as $type parameter. If no $type
|
||||||
|
* parameter is placed this method will serialize the model to XML/RDF
|
||||||
|
* format.
|
||||||
|
* Returns FALSE if the InfModelB couldn't be saved to the file.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $filename
|
||||||
|
* @param string $type
|
||||||
|
* @throws PhpError
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function saveAs($filename, $type ='rdf')
|
||||||
|
{
|
||||||
|
|
||||||
|
$memmodel=$this->getMemModel();
|
||||||
|
return $memmodel->saveAs($filename, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the RDF serialization of the Model including ALL inferable
|
||||||
|
* triples as HTML.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function writeAsHtml()
|
||||||
|
{
|
||||||
|
require_once(RDFAPI_INCLUDE_DIR.PACKAGE_SYNTAX_RDF);
|
||||||
|
$ser = new RdfSerializer();
|
||||||
|
$rdf =& $ser->serialize($this->getMemModel());
|
||||||
|
$rdf = htmlspecialchars($rdf, ENT_QUOTES);
|
||||||
|
$rdf = str_replace(' ', ' ', $rdf);
|
||||||
|
$rdf = nl2br($rdf);
|
||||||
|
echo $rdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the RDF serialization of the Model including ALL inferable
|
||||||
|
* triples as HTML table.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function writeAsHtmlTable()
|
||||||
|
{
|
||||||
|
// Import Package Utility
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_UTILITY);
|
||||||
|
RDFUtil::writeHTMLTable($this->getMemModel());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the RDF serialization of the Model including ALL inferable
|
||||||
|
* triples.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function writeRdfToString()
|
||||||
|
{
|
||||||
|
// Import Package Syntax
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_SYNTAX_RDF);
|
||||||
|
$ser = new RdfSerializer();
|
||||||
|
$rdf =& $ser->serialize($this->getMemModel());
|
||||||
|
return $rdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the triple from the MemModel.
|
||||||
|
* TRUE if the triple is removed.
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* Checks, if it touches any statements, that added inference rules
|
||||||
|
* to the model.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function remove($statement)
|
||||||
|
{
|
||||||
|
if (parent::contains($statement))
|
||||||
|
{
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference));
|
||||||
|
while (count($this->_removeFromInference($statement))>0);
|
||||||
|
|
||||||
|
$this->findDeadEnds=array();
|
||||||
|
return parent::remove($statement);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, if a single node matches a single find pattern.
|
||||||
|
* TRUE if the node matches.
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* Checks, if it touches any statements, that added inference rules
|
||||||
|
* to the model.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _nodeEqualsFind(& $find, $node)
|
||||||
|
{
|
||||||
|
//If the find pattern is a node, use the nodes equal-method and
|
||||||
|
//return the result.
|
||||||
|
if (is_a($find,'Node'))
|
||||||
|
return $node->equals($find);
|
||||||
|
|
||||||
|
//Null-pattern matches anything.
|
||||||
|
if ($find == null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a FindIterator for traversing the MemModel.
|
||||||
|
* Disabled in InfModelB.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object FindIterator
|
||||||
|
*/
|
||||||
|
function & findAsIterator($sub=null,$pred=null,$obj=null) {
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModelB; method: findAsIterator):
|
||||||
|
This function is disabled in the
|
||||||
|
Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,406 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfModelF
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A InfModelF extends the InfModel Class, with a forward chaining algorithm.
|
||||||
|
* If a new statement is added, it is enferd at
|
||||||
|
* once and all the entailed statements are added too.
|
||||||
|
* When adding or removing a statement, that produced a new inference rule,
|
||||||
|
* all entailed statements are discarded and the whole base model is infered
|
||||||
|
* again.
|
||||||
|
* The InfModelF is safe for loops in Ontologies, that would cause infinite loops.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class InfModelF extends InfModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array that holds the position of the infered statements in the model.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infPos;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable that influences the habbit when adding statements.
|
||||||
|
* Used by the loadModel method to increase performance.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $inferenceEnabled;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a base_uri.
|
||||||
|
*
|
||||||
|
* @param string $baseURI
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function InfModelF($baseURI = NULL)
|
||||||
|
{
|
||||||
|
parent::InfModel($baseURI);
|
||||||
|
$this->infPos=array();
|
||||||
|
$this->inferenceEnabled=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new triple to the MemModel without checking if the statement
|
||||||
|
* is already in the MemModel.
|
||||||
|
* So if you want a duplicate free MemModel use the addWithoutDuplicates()
|
||||||
|
* function (which is slower then add())
|
||||||
|
* The statement is infered and all entailed statements are added.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function add ($statement)
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
if ($this->inferenceEnabled)
|
||||||
|
{
|
||||||
|
foreach ($this->entailStatement($statement) as $state)
|
||||||
|
{
|
||||||
|
//a addWithoutDublicates construct
|
||||||
|
if(!$this->contains($state))
|
||||||
|
{
|
||||||
|
|
||||||
|
parent::add($state);
|
||||||
|
//save the position of the infered statements
|
||||||
|
end($this->triples);
|
||||||
|
$this->infPos[]=key($this->triples);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
//apply the complete inference to the model, if the added statement was able to add a rule
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a new statement is already in the MemModel and adds
|
||||||
|
* the statement, if it is not in the MemModel.
|
||||||
|
* addWithoutDuplicates() is significantly slower then add().
|
||||||
|
* Retruns TRUE if the statement is added.
|
||||||
|
* FALSE otherwise.
|
||||||
|
* The statement is infered and all entailed statements are added.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function addWithoutDuplicates(& $statement)
|
||||||
|
{
|
||||||
|
if(!$this->contains($statement))
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
if ($this->inferenceEnabled)
|
||||||
|
{
|
||||||
|
foreach ($this->entailStatement($statement) as $statement)
|
||||||
|
{
|
||||||
|
if(!$this->contains($statement))
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//save the position of the infered statements
|
||||||
|
end($this->triples);
|
||||||
|
$this->infPos[]=key($this->triples);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entails every statement and adds the entailments if not already
|
||||||
|
* in the model.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function applyInference()
|
||||||
|
{
|
||||||
|
//check every statement in the model
|
||||||
|
foreach ($this->triples as $statement)
|
||||||
|
{
|
||||||
|
//gat all statements, that it recursively entails
|
||||||
|
foreach ($this->entailStatement($statement) as $statement)
|
||||||
|
{
|
||||||
|
if (!$this->contains($statement))
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//add the InfStatement position to the index
|
||||||
|
end($this->triples);
|
||||||
|
$this->infPos[]=key($this->triples);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entails a statement by recursively using the _entailStatementRec
|
||||||
|
* method.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return array of statements
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function entailStatement (& $statement)
|
||||||
|
{
|
||||||
|
$infStatementsIndex=array();
|
||||||
|
return $this->_entailStatementRec($statement,$infStatementsIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursive method, that checks the statement with the trigger of
|
||||||
|
* every rule. If the trigger matches and entails new statements,
|
||||||
|
* those statements are recursively infered too.
|
||||||
|
* The $infStatementsIndex array holds lready infered statements
|
||||||
|
* to prevent infinite loops.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @param array $infStatementsIndex
|
||||||
|
* @return array of statements
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _entailStatementRec ( $statement,& $infStatementsIndex)
|
||||||
|
{
|
||||||
|
$infStatements = array();
|
||||||
|
$return = array();
|
||||||
|
|
||||||
|
//dont entail statements about the supported inference-schema
|
||||||
|
if (!in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
{
|
||||||
|
//check only the rules, that were returned by the index
|
||||||
|
foreach ($this->_findRuleTriggerInIndex($statement) as $key )
|
||||||
|
{
|
||||||
|
$infRule=$this->infRules[$key];
|
||||||
|
|
||||||
|
$stateString=$key.serialize($statement);
|
||||||
|
//If the statement wasn't infered before
|
||||||
|
if (!in_array($stateString,$infStatementsIndex))
|
||||||
|
{
|
||||||
|
$infStatementsIndex[]=$stateString;
|
||||||
|
//Check, if the Statements triggers this rule
|
||||||
|
if($infRule->checkTrigger($statement))
|
||||||
|
{
|
||||||
|
$infStatement=$infRule->entail($statement);
|
||||||
|
#if(!$this->contains($infStatement))
|
||||||
|
{
|
||||||
|
$return[]=$infStatement;
|
||||||
|
$return=array_merge($return,
|
||||||
|
$this->_entailStatementRec($infStatement,
|
||||||
|
$infStatementsIndex));
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all infered statements from the model but keeps the
|
||||||
|
* infernece rules.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function removeInfered()
|
||||||
|
{
|
||||||
|
$indexTmp=$this->indexed;
|
||||||
|
$this->index(-1);
|
||||||
|
foreach ($this->infPos as $key)
|
||||||
|
{
|
||||||
|
unset($this->triples[$key]);
|
||||||
|
};
|
||||||
|
$this->infPos=array();
|
||||||
|
$this->index($indexTmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a model from a file containing RDF, N3 or N-Triples.
|
||||||
|
* This function recognizes the suffix of the filename (.n3 or .rdf) and
|
||||||
|
* calls a suitable parser, if no $type is given as string
|
||||||
|
* ("rdf" "n3" "nt");
|
||||||
|
* If the model is not empty, the contents of the file is added to
|
||||||
|
* this DbModel.
|
||||||
|
*
|
||||||
|
* While loading the model, the inference entailing is disabled, but
|
||||||
|
* new inference rules are added to increase performance.
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* @param string $type
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function load($filename, $type = NULL)
|
||||||
|
{
|
||||||
|
//Disable entailing to increase performance
|
||||||
|
$this->inferenceEnabled=false;
|
||||||
|
parent::load($filename, $type);
|
||||||
|
//Enable entailing
|
||||||
|
$this->inferenceEnabled=true;
|
||||||
|
//Entail all statements
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short Dump of the InfModelF.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toString() {
|
||||||
|
return 'InfModelF[baseURI=' . $this->getBaseURI() . ';
|
||||||
|
size=' . $this->size(true) . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing all the triples (including inferred
|
||||||
|
* statements) of the current InfModelF.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function & getMemModel()
|
||||||
|
{
|
||||||
|
$return= new MemModel();
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
foreach ($this->triples as $statement)
|
||||||
|
$return->add($statement);
|
||||||
|
|
||||||
|
$return->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing only the base triples
|
||||||
|
* (without inferred statements) of the current InfModelF.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getBaseMemModel()
|
||||||
|
{
|
||||||
|
$return= new MemModel();
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
foreach ($this->triples as $key => $statement)
|
||||||
|
if (!in_array($key,$this->infPos))
|
||||||
|
$return->add($statement);
|
||||||
|
$retun->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the triple from the MemModel.
|
||||||
|
* TRUE if the triple is removed.
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* Checks, if it touches any statements, that added inference rules
|
||||||
|
* to the model
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function remove($statement)
|
||||||
|
{
|
||||||
|
//If the statement is in the model
|
||||||
|
if($this->contains($statement))
|
||||||
|
{
|
||||||
|
$inferenceRulesWereTouched=false;
|
||||||
|
//If the statement was able to add inference rules
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
{
|
||||||
|
$statementPositions=$this->_removeFromInference($statement);
|
||||||
|
$inferenceRulesWereTouched=true;
|
||||||
|
} else
|
||||||
|
//get the position of all matching statements
|
||||||
|
{
|
||||||
|
$statementPositions=array();
|
||||||
|
//find the positions of the statements
|
||||||
|
$statementPosition=-1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
|
||||||
|
$statementPosition =
|
||||||
|
$this->findFirstMatchOff($statement->getSubject(),
|
||||||
|
$statement->getPredicate(),
|
||||||
|
$statement->getObject(),
|
||||||
|
$statementPosition+1);
|
||||||
|
|
||||||
|
if ($statementPosition!=-1)
|
||||||
|
$statementPositions[]=$statementPosition;
|
||||||
|
|
||||||
|
} while ($statementPosition != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove matching statements
|
||||||
|
parent::remove($statement);
|
||||||
|
foreach ($statementPositions as $statementPosition)
|
||||||
|
{
|
||||||
|
//if the statement was infered, remove it from the index of the infered statements.
|
||||||
|
if (in_array($statementPosition,$this->infPos))
|
||||||
|
unset ($this->infPos[$statementPosition]);
|
||||||
|
}
|
||||||
|
if ($inferenceRulesWereTouched)
|
||||||
|
{
|
||||||
|
//remove the statement and re-entail the model
|
||||||
|
$this->removeInfered();
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds another model to this MemModel.
|
||||||
|
* Duplicate statements are not removed.
|
||||||
|
* If you don't want duplicates, use unite().
|
||||||
|
* If any statement of the model to be added to this model contains a blankNode
|
||||||
|
* with an identifier already existing in this model, a new blankNode is generated.
|
||||||
|
*
|
||||||
|
* @param object Model $model
|
||||||
|
* @access public
|
||||||
|
* @throws phpErrpr
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function addModel(&$model)
|
||||||
|
{
|
||||||
|
//Disable entailing to increase performance
|
||||||
|
$this->inferenceEnabled=false;
|
||||||
|
parent::addModel($model);
|
||||||
|
//Enable entailing
|
||||||
|
$this->inferenceEnabled=true;
|
||||||
|
//Entail all statements
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
?>
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// InfModel Package
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Description : InfModel package
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Author: Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Include InfModel classes
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfRule.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfStatement.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfModel.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfModelB.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfModelF.php');
|
||||||
|
?>
|
||||||
@ -0,0 +1,343 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfRule
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class represents a single rule in a RDFS inference model.
|
||||||
|
* It primary constists of a trigger and an entailment.
|
||||||
|
* In the forward-chaining mode (RDFSFModel) a statement is checked,
|
||||||
|
* if it satisfies the trigger. If it does, a new statement is returned.
|
||||||
|
* In the backward-chaining mode (RDFSBModel) a find-query is checked
|
||||||
|
* with the entailment. If this entailment could satify the find-query,
|
||||||
|
* a new find-query is returned, that searches for statements that
|
||||||
|
* satisfy the trigger of this rule.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class InfRule
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array, that hold the trigger subject in key ['s'], the trigger
|
||||||
|
* predicate in ['p'], and the trigger object in ['o'].
|
||||||
|
* The array values can be NULL to match anything or be a node that
|
||||||
|
* has to be matched.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $trigger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array, that hold the entailment subject in key ['s'], the
|
||||||
|
* entailment predicate in ['p'], and the entailment object in ['o'].
|
||||||
|
* The array values can be a node that will be inserted in the
|
||||||
|
* returning statement, or '<s>' to insert the subject,'<p>' to insert
|
||||||
|
* the predicate, or '<o>' to insert the object of the checked statement
|
||||||
|
* to this position in the new returned statement.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $entailment;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function infRule()
|
||||||
|
{
|
||||||
|
//initialising vars
|
||||||
|
$this->trigger=array();
|
||||||
|
$this->entailment=array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the trigger of this rule
|
||||||
|
* The values can be NULL to match anything or be a node that has to
|
||||||
|
* be matched.
|
||||||
|
*
|
||||||
|
* @param object Node OR NULL $subject
|
||||||
|
* @param object Node OR NULL $predicate
|
||||||
|
* @param object Node OR NULL $object
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function setTrigger ($subject, $predicate, $object)
|
||||||
|
{
|
||||||
|
//throw an error if subject, predicate, or object are neither
|
||||||
|
//node, nor null.
|
||||||
|
if(!is_a($subject,'Node') && $subject != null)
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setTrigger): $subject has to be null or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($predicate,'Node') && $predicate != null)
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setTrigger): $predicate has to be null or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($object,'Node') && $object != null)
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setTrigger): $object has to be null or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
|
||||||
|
//set the trigger
|
||||||
|
$this->trigger['s']=$subject;
|
||||||
|
$this->trigger['p']=$predicate;
|
||||||
|
$this->trigger['o']=$object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the entailment of this rule
|
||||||
|
* The values can be NULL to match anything or be a node that has to
|
||||||
|
* be matched.
|
||||||
|
*
|
||||||
|
* @param object Node OR NULL $subject
|
||||||
|
* @param object Node OR NULL $predicate
|
||||||
|
* @param object Node OR NULL $object
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function setEntailment($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
//throw an error if subject, predicate, or object are neither node,
|
||||||
|
//nor <s>,<p>,<o>.
|
||||||
|
if(!is_a($subject,'Node') && !ereg('<[spo]>', $subject))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setEntailment): $subject has to be <s>,<p>,or <o> or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($predicate,'Node') && !ereg('<[spo]>', $predicate))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setEntailment): $predicate has to be <s>,<p>,or <o> or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($object,'Node') && !ereg('<[spo]>', $object))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setEntailment): $object has to be <s>,<p>,or <o> or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
|
||||||
|
$this->entailment['s']=$subject;
|
||||||
|
$this->entailment['p']=$predicate;
|
||||||
|
$this->entailment['o']=$object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, if the statement satisfies the trigger.
|
||||||
|
*
|
||||||
|
* @param object Statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function checkTrigger(& $statement)
|
||||||
|
{
|
||||||
|
//is true, if the trigger is null to match anything
|
||||||
|
//or equals the statement's subject
|
||||||
|
$shouldFireS = $this->trigger['s'] == null ||
|
||||||
|
$this->trigger['s']->equals($statement->getSubject());
|
||||||
|
|
||||||
|
//is true, if the trigger is null to match anything
|
||||||
|
//or equals the statement's predicate
|
||||||
|
$shouldFireP = $this->trigger['p'] == null ||
|
||||||
|
$this->trigger['p']->equals($statement->getPredicate());
|
||||||
|
|
||||||
|
//is true, if the trigger is null to match anything
|
||||||
|
//or equals the statement's object
|
||||||
|
$shouldFireO = $this->trigger['o'] == null ||
|
||||||
|
$this->trigger['o']->equals($statement->getObject());
|
||||||
|
|
||||||
|
//returns true, if ALL are true
|
||||||
|
return $shouldFireS && $shouldFireP && $shouldFireO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, if this rule could entail a statement that matches
|
||||||
|
* a find of $subject,$predicate,$object.
|
||||||
|
*
|
||||||
|
* @param object Statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function checkEntailment ($subject, $predicate, $object)
|
||||||
|
{
|
||||||
|
//true, if $subject is null, the entailment's subject matches
|
||||||
|
//anything, or the $subject equals the entailment-subject.
|
||||||
|
$matchesS= $subject == null ||
|
||||||
|
!is_a($this->entailment['s'],'Node') ||
|
||||||
|
$this->entailment['s']->equals($subject);
|
||||||
|
|
||||||
|
//true, if $predicate is null, the entailment's predicate matches
|
||||||
|
//anything, or the $predicate equals the entailment-predicate.
|
||||||
|
$matchesP= $predicate == null ||
|
||||||
|
!is_a($this->entailment['p'],'Node') ||
|
||||||
|
$this->entailment['p']->equals($predicate);
|
||||||
|
|
||||||
|
//true, if $object is null, the entailment's object matches
|
||||||
|
//anything, or the $object equals the entailment-object.
|
||||||
|
$matchesO= $object == null ||
|
||||||
|
!is_a($this->entailment['o'],'Node') ||
|
||||||
|
$this->entailment['o']->equals($object);
|
||||||
|
|
||||||
|
//returns true, if ALL are true
|
||||||
|
return $matchesS && $matchesP && $matchesO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a infered InfStatement by evaluating the statement with
|
||||||
|
* the entailment rule.
|
||||||
|
*
|
||||||
|
* @param object Statement
|
||||||
|
* @return object InfStatement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function entail(& $statement)
|
||||||
|
{
|
||||||
|
//if the entailment's subject is <s>,<p>,or <o>, put the statements
|
||||||
|
//subject,predicate,or object into the subject of the
|
||||||
|
//entailed statement. If the entailment's subject is a node,
|
||||||
|
//add that node to the statement.
|
||||||
|
switch ($this->entailment['s'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$entailedSubject=$statement->getSubject();
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$entailedSubject=$statement->getPredicate();
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$entailedSubject=$statement->getObject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$entailedSubject=$this->entailment['s'];
|
||||||
|
};
|
||||||
|
|
||||||
|
//if the entailment's predicate is <s>,<p>,or <o>, put the
|
||||||
|
//statements subject,predicate,or object into the predicate of
|
||||||
|
//the entailed statement. If the entailment's predicate is a node,
|
||||||
|
//add that node to the statement.
|
||||||
|
switch ($this->entailment['p'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$entailedPredicate=$statement->getSubject();
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$entailedPredicate=$statement->getPredicate();
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$entailedPredicate=$statement->getObject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$entailedPredicate=$this->entailment['p'];
|
||||||
|
};
|
||||||
|
|
||||||
|
//if the entailment's object is <s>,<p>,or <o>, put the
|
||||||
|
//statements subject,predicate,or object into the object of
|
||||||
|
//the entailed statement. If the entailment's object is a node,
|
||||||
|
//add that node to the statement.
|
||||||
|
switch ($this->entailment['o'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$entailedObject=$statement->getSubject();
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$entailedObject=$statement->getPredicate();
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$entailedObject=$statement->getObject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$entailedObject=$this->entailment['o'];
|
||||||
|
};
|
||||||
|
|
||||||
|
//return the infered statement
|
||||||
|
return (new InfStatement($entailedSubject,$entailedPredicate,$entailedObject));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a find-query that matches statements, whose entailed
|
||||||
|
* statements would match the supplied find query.
|
||||||
|
*
|
||||||
|
* @param Node OR null $subject
|
||||||
|
* @param Node OR null $predicate
|
||||||
|
* @param Node OR null $object
|
||||||
|
* @return array
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function getModifiedFind( $subject, $predicate, $object)
|
||||||
|
{
|
||||||
|
$findSubject=$this->trigger['s'];
|
||||||
|
$findPredicate=$this->trigger['p'];
|
||||||
|
$findObject=$this->trigger['o'];
|
||||||
|
|
||||||
|
switch ($this->entailment['s'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$findSubject=$subject;
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$findPredicate=$subject;
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$findObject=$subject;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
switch ($this->entailment['p'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$findSubject=$predicate;
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$findPredicate=$predicate;
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$findObject=$predicate;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
switch ($this->entailment['o'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$findSubject=$object;
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$findPredicate=$object;
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$findObject=$object;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
return array('s' => $findSubject,
|
||||||
|
'p' => $findPredicate,
|
||||||
|
'o' => $findObject );
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTrigger()
|
||||||
|
{
|
||||||
|
return array ( 's' => $this->trigger['s'],
|
||||||
|
'p' => $this->trigger['p'],
|
||||||
|
'o' => $this->trigger['o'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEntailment()
|
||||||
|
{
|
||||||
|
return array ( 's' => $this->entailment['s'],
|
||||||
|
'p' => $this->entailment['p'],
|
||||||
|
'o' => $this->entailment['o'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfStatement
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An RDF statement which was entailed by a inference rule.
|
||||||
|
* See Statement Class for further information.
|
||||||
|
*
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
* @version $Id$
|
||||||
|
* @package infModel
|
||||||
|
*/
|
||||||
|
class InfStatement extends Statement {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,678 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: infModel
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A InfModel Model extends a MemModel , by adding the ability to infer statements from
|
||||||
|
* known statements and RDFS/OWL-Schematas.
|
||||||
|
* It uses the same interface as MemModel, thus making the
|
||||||
|
* infererence process hidden.
|
||||||
|
*
|
||||||
|
* @version $Id: InfModel.php 290 2006-06-22 12:23:24Z tgauss $
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
|
||||||
|
class InfModel extends MemModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Array that holds the objects of the class Infrule,
|
||||||
|
* which were assigned by the _addToInference() function
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infRules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of URI-Strings that produces Infrules.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $supportedInference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of the connection between the infrules and the statement
|
||||||
|
* that assigned those rules.
|
||||||
|
* array[2][3]=true;array[2][5]=true means, that statement 2
|
||||||
|
* assigned rule 3 & 5 to the model.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $statementRuleIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of the infRule triggers and the matching infrules.
|
||||||
|
* $this->infRulesTriggerIndex['s'] for subject index, ['p'] for predicates,
|
||||||
|
* and ['o'] for objects.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infRulesTriggerIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of the infRule entailments and the matching infrules.
|
||||||
|
* $this->infRulesEntailIndex['s'] for subject index, ['p'] for predicates,
|
||||||
|
* and ['o'] for objects.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infRulesEntailIndex;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a base_uri
|
||||||
|
*
|
||||||
|
* @param string $baseURI
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function InfModel ($baseURI = NULL)
|
||||||
|
{
|
||||||
|
//call the memmodel constructor method
|
||||||
|
parent::MemModel($baseURI);
|
||||||
|
//initialise vars
|
||||||
|
$this->infRulesTriggerIndex['s']=array();
|
||||||
|
$this->infRulesTriggerIndex['p']=array();
|
||||||
|
$this->infRulesTriggerIndex['o']=array();
|
||||||
|
$this->infRulesEntailIndex['s']=array();
|
||||||
|
$this->infRulesEntailIndex['p']=array();
|
||||||
|
$this->infRulesEntailIndex['o']=array();
|
||||||
|
$this->infRules=array();
|
||||||
|
$this->statementRuleIndex = array();
|
||||||
|
//arraylist of predicate labels that shall add inference rules
|
||||||
|
//to the model
|
||||||
|
//The constants, wich statements will create rules can be configured in constants.php
|
||||||
|
if (INF_RES_SUBCLASSOF)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_SUBCLASSOF;
|
||||||
|
|
||||||
|
if (INF_RES_SUBPROPERTYOF)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF;
|
||||||
|
|
||||||
|
if (INF_RES_RANGE)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_RANGE;
|
||||||
|
|
||||||
|
if (INF_RES_DOMAIN)
|
||||||
|
$this->supportedInference[] = RDF_SCHEMA_URI.RDFS_DOMAIN;
|
||||||
|
|
||||||
|
if (INF_RES_OWL_SAMEAS)
|
||||||
|
$this->supportedInference[] = OWL_URI.OWL_SAME_AS;
|
||||||
|
|
||||||
|
if (INF_RES_OWL_INVERSEOF)
|
||||||
|
$this->supportedInference[] = OWL_URI.OWL_INVERSE_OF;
|
||||||
|
|
||||||
|
//Rule: rdfs12
|
||||||
|
if (INF_RES_RULE_RDFS12)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.'ContainerMembershipProperty'));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF),new Resource(RDF_SCHEMA_URI.'member'));
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs6
|
||||||
|
if (INF_RES_RULE_RDFS6)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_NAMESPACE_URI.RDF_PROPERTY));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF),'<s>');
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs8
|
||||||
|
if (INF_RES_RULE_RDFS8)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.RDFS_CLASS));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBCLASSOF),new Resource(RDF_SCHEMA_URI.RDFS_RESOURCE));
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs10
|
||||||
|
if (INF_RES_RULE_RDFS10)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.RDFS_CLASS));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBCLASSOF),'<s>');
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rule: rdfs13
|
||||||
|
if (INF_RES_RULE_RDFS13)
|
||||||
|
{
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),new Resource(RDF_SCHEMA_URI.RDFS_DATATYPE));
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_SCHEMA_URI.RDFS_SUBCLASSOF),new Resource(RDF_SCHEMA_URI.RDFS_LITERAL));
|
||||||
|
$this->_addInfRule($infRule,'base');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new triple to the Model without checking if the statement
|
||||||
|
* is already in the Model.
|
||||||
|
* So if you want a duplicate free MemModel use the addWithoutDuplicates()
|
||||||
|
* function (which is slower then add())
|
||||||
|
* If the statement's predicate label is supported by the inference,
|
||||||
|
* the matching rules are added.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function add($statement)
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//if the predicate is supported by the inference
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
{
|
||||||
|
$this->_addToInference($statement);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function analyses the statement's predicate and adds the
|
||||||
|
* matching infrule to the model.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _addToInference($statement)
|
||||||
|
{
|
||||||
|
$predicateLabel=$statement->getLabelPredicate();
|
||||||
|
//get the position of the the statement in the model
|
||||||
|
end($this->triples);
|
||||||
|
$statementPosition=key($this->triples);
|
||||||
|
|
||||||
|
switch ($predicateLabel)
|
||||||
|
{
|
||||||
|
case RDF_SCHEMA_URI.RDFS_SUBPROPERTYOF :
|
||||||
|
//create a new rule
|
||||||
|
$infRule=new InfRule();
|
||||||
|
//set the trigger to match all statements, having a
|
||||||
|
//predicate, that matches the subject of the statement that
|
||||||
|
//created this rule.
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
//set the infrule to return a statement, having the same
|
||||||
|
//subject and object as the statement, that asked for an
|
||||||
|
//entailment, and having the object of the statement,
|
||||||
|
//that created this rule as predicate.
|
||||||
|
$infRule->setEntailment('<s>',$statement->getObject(),'<o>');
|
||||||
|
//add the infule to Model, Statement/Rule-Index,
|
||||||
|
//and Rule/Trigger (or Rule/Entailment) index
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDF_SCHEMA_URI.RDFS_SUBCLASSOF :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getSubject());
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getObject());
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDF_SCHEMA_URI.RDFS_DOMAIN :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<s>',new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getObject());
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RDF_SCHEMA_URI.RDFS_RANGE :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<o>',new Resource(RDF_NAMESPACE_URI.RDF_TYPE),$statement->getObject());
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWL_URI.OWL_INVERSE_OF :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<o>',$statement->getObject(),'<s>');
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getObject(),null);
|
||||||
|
$infRule->setEntailment('<o>',$statement->getSubject(),'<s>');
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWL_URI.OWL_SAME_AS :
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger($statement->getSubject(),null,null);
|
||||||
|
$infRule->setEntailment($statement->getObject(),'<p>','<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger($statement->getObject(),null,null);
|
||||||
|
$infRule->setEntailment($statement->getSubject(),'<p>','<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getSubject(),null);
|
||||||
|
$infRule->setEntailment('<s>',$statement->getObject(),'<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,$statement->getObject(),null);
|
||||||
|
$infRule->setEntailment('<s>',$statement->getSubject(),'<o>');
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,null,$statement->getSubject());
|
||||||
|
$infRule->setEntailment('<s>','<p>',$statement->getObject());
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
|
||||||
|
$infRule=new InfRule();
|
||||||
|
$infRule->setTrigger(null,null,$statement->getObject());
|
||||||
|
$infRule->setEntailment('<s>','<p>',$statement->getSubject());
|
||||||
|
$this->_addInfRule($infRule,$statementPosition);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function checks, which infrules were added by the statement and
|
||||||
|
* removes those.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _removeFromInference($statement)
|
||||||
|
{
|
||||||
|
$return= array();
|
||||||
|
$statementPosition=-1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//get the position of the statement that should be removed
|
||||||
|
$statementPosition=$this->findFirstMatchOff($statement->getSubject(),
|
||||||
|
$statement->getPredicate(),
|
||||||
|
$statement->getObject(),
|
||||||
|
$statementPosition+1);
|
||||||
|
if ($statementPosition!=-1)
|
||||||
|
{
|
||||||
|
//if it added any rules
|
||||||
|
if (isset ($this->statementRuleIndex[$statementPosition]))
|
||||||
|
{
|
||||||
|
//remove all rules
|
||||||
|
foreach ($this->statementRuleIndex[$statementPosition] as $key => $value)
|
||||||
|
{
|
||||||
|
//remove from Rule-Trigger Index
|
||||||
|
if (is_a($this,'InfModelF'))
|
||||||
|
{
|
||||||
|
$trigger=$this->infRules[$key]->getTrigger();
|
||||||
|
|
||||||
|
if(is_a($trigger['s'],'Node'))
|
||||||
|
{
|
||||||
|
$subjectLabel=$trigger['s']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$subjectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesTriggerIndex['s'][$subjectLabel][array_search($key,$this->infRulesTriggerIndex['s'][$subjectLabel])]);
|
||||||
|
|
||||||
|
if(is_a($trigger['p'],'Node'))
|
||||||
|
{
|
||||||
|
$predicateLabel=$trigger['p']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$predicateLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesTriggerIndex['p'][$predicateLabel][array_search($key,$this->infRulesTriggerIndex['p'][$predicateLabel])]);
|
||||||
|
|
||||||
|
if(is_a($trigger['o'],'Node'))
|
||||||
|
{
|
||||||
|
$objectLabel=$trigger['o']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$objectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesTriggerIndex['o'][$objectLabel][array_search($key,$this->infRulesTriggerIndex['o'][$objectLabel])]);
|
||||||
|
} else
|
||||||
|
//remove from Rule-Entailment Index
|
||||||
|
{
|
||||||
|
$entailment=$this->infRules[$key]->getEntailment();
|
||||||
|
|
||||||
|
if(is_a($entailment['s'],'Node'))
|
||||||
|
{
|
||||||
|
$subjectLabel=$entailment['s']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$subjectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesEntailIndex['s'][$subjectLabel][array_search($key,$this->infRulesEntailIndex['s'][$subjectLabel])]);
|
||||||
|
|
||||||
|
|
||||||
|
if(is_a($entailment['p'],'Node'))
|
||||||
|
{
|
||||||
|
$predicateLabel=$entailment['p']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$predicateLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesEntailIndex['p'][$predicateLabel][array_search($key,$this->infRulesEntailIndex['p'][$predicateLabel])]);
|
||||||
|
|
||||||
|
if(is_a($entailment['o'],'Node'))
|
||||||
|
{
|
||||||
|
$objectLabel=$entailment['o']->getLabel();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$objectLabel='null';
|
||||||
|
}
|
||||||
|
unset ($this->infRulesEntailIndex['o'][$objectLabel][array_search($key,$this->infRulesEntailIndex['o'][$objectLabel])]);
|
||||||
|
}
|
||||||
|
//remove from statement-Rule Index
|
||||||
|
unset ($this->infRules[$key]);
|
||||||
|
}
|
||||||
|
unset($this->statementRuleIndex[$statementPosition]);
|
||||||
|
$return[]=$statementPosition;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
} while($statementPosition!=-1);
|
||||||
|
|
||||||
|
//return the positions of the statements to be removed OR emty array
|
||||||
|
//if nothing was found.
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a model, containing all Statements, having a Predicate, that
|
||||||
|
* is supported by the inference.
|
||||||
|
*
|
||||||
|
* @return object Model
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getSchema()
|
||||||
|
{
|
||||||
|
$res=new MemModel();
|
||||||
|
//Search the base-model for all statements, having a Predicate, that
|
||||||
|
//is supported by the inference.
|
||||||
|
foreach ($this->supportedInference as $inferencePredicateLabel)
|
||||||
|
{
|
||||||
|
$res->addModel($this->find(null, new Resource($inferencePredicateLabel), null));
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* General method to replace nodes of a MemModel.
|
||||||
|
* This function is disabled in the Inference Model.
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @param object Node $replacement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function replace($subject, $predicate, $object, $replacement)
|
||||||
|
{
|
||||||
|
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModel; method: replace): This function is disabled in the Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to search for triples using Perl-style regular expressions.
|
||||||
|
* NULL input for any parameter will match anything.
|
||||||
|
* Example: $result = $m->find_regex( NULL, NULL, $regex );
|
||||||
|
* Finds all triples where the label of the object node matches the regular
|
||||||
|
* expression.
|
||||||
|
* Returns an empty MemModel if nothing is found.
|
||||||
|
*
|
||||||
|
* This function is disabled in the Inference Model
|
||||||
|
*
|
||||||
|
* @param string $subject_regex
|
||||||
|
* @param string $predicate_regex
|
||||||
|
* @param string $object_regex
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function findRegex($subject_regex, $predicate_regex, $object_regex)
|
||||||
|
{
|
||||||
|
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModel; method: findRegex):
|
||||||
|
This function is disabled in the
|
||||||
|
Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all tripels of a certain vocabulary.
|
||||||
|
* $vocabulary is the namespace of the vocabulary inluding a # : / char at
|
||||||
|
* the end.
|
||||||
|
* e.g. http://www.w3.org/2000/01/rdf-schema#
|
||||||
|
* Returns an empty MemModel if nothing is found.
|
||||||
|
*
|
||||||
|
* This function is disabled in the Inference Model.
|
||||||
|
*
|
||||||
|
* @param string $vocabulary
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function findVocabulary($vocabulary)
|
||||||
|
{
|
||||||
|
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModel; method: findVocabulary):
|
||||||
|
This function is disabled in the
|
||||||
|
Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the URI or NULL to the Infrule trigger or entailment index.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object infrule $infRule
|
||||||
|
* @param integer $infRulePosition
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _addInfruleToIndex(& $infRule,& $infRulePosition)
|
||||||
|
{
|
||||||
|
//Add the rule only to the trigger index, if it is a InfFModel
|
||||||
|
if (is_a($this,'InfModelF'))
|
||||||
|
{
|
||||||
|
//get the trigger
|
||||||
|
$trigger = $infRule->getTrigger();
|
||||||
|
//evaluate and set the index
|
||||||
|
if ($trigger['s'] == null)
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['s']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['s'][$trigger['s']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($trigger['p'] == null)
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['p']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['p'][$trigger['p']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($trigger['o'] == null)
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['o']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesTriggerIndex['o'][$trigger['o']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
} else
|
||||||
|
//add to entailment Index if it is a BModel
|
||||||
|
{
|
||||||
|
//get the entailment
|
||||||
|
$entailment = $infRule->getEntailment();
|
||||||
|
//evaluate the entailment and add to index
|
||||||
|
if (!is_a($entailment['s'],'Node'))
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['s']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['s'][$entailment['s']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!is_a($entailment['p'],'Node'))
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['p']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['p'][$entailment['p']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!is_a($entailment['o'],'Node'))
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['o']['null'][]=$infRulePosition;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$this->infRulesEntailIndex['o'][$entailment['o']->getLabel()][]=$infRulePosition;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the trigger-index for a matching trigger and returns an
|
||||||
|
* array of infRule positions.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object infrule $infRule
|
||||||
|
* @return array integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _findRuleTriggerInIndex($statement)
|
||||||
|
{
|
||||||
|
$return=array();
|
||||||
|
//a statement's subject matches all triggers with null and the same URI
|
||||||
|
$subjectLabel=$statement->getLabelSubject();
|
||||||
|
$inIndexS=array();
|
||||||
|
if (isset($this->infRulesTriggerIndex['s']['null']))
|
||||||
|
$inIndexS=array_values($this->infRulesTriggerIndex['s']['null']);
|
||||||
|
if (isset($this->infRulesTriggerIndex['s'][$subjectLabel]))
|
||||||
|
$inIndexS= array_merge($inIndexS,array_values($this->infRulesTriggerIndex['s'][$subjectLabel]));
|
||||||
|
|
||||||
|
//a statement's predicate matches all triggers with null and the same URI
|
||||||
|
$predicateLabel=$statement->getLabelPredicate();
|
||||||
|
$inIndexP=array();
|
||||||
|
if (isset($this->infRulesTriggerIndex['p']['null']))
|
||||||
|
$inIndexP=array_values($this->infRulesTriggerIndex['p']['null']);
|
||||||
|
if (isset($this->infRulesTriggerIndex['p'][$predicateLabel]))
|
||||||
|
$inIndexP= array_merge($inIndexP,array_values($this->infRulesTriggerIndex['p'][$predicateLabel]));
|
||||||
|
|
||||||
|
//a statement's object matches all triggers with null and the same URI
|
||||||
|
$objectLabel=$statement->getLabelObject();
|
||||||
|
$inIndexO=array();
|
||||||
|
if (isset($this->infRulesTriggerIndex['o']['null']))
|
||||||
|
$inIndexO=array_values($this->infRulesTriggerIndex['o']['null']);
|
||||||
|
if (isset($this->infRulesTriggerIndex['o'][$objectLabel]))
|
||||||
|
$inIndexO= array_merge($inIndexO,array_values($this->infRulesTriggerIndex['o'][$objectLabel]));
|
||||||
|
|
||||||
|
//if an infrule position occurs in subject, predicate, and object index, add to result array.
|
||||||
|
foreach ($inIndexP as $positionP)
|
||||||
|
{
|
||||||
|
if (in_array($positionP,$inIndexO))
|
||||||
|
if (in_array($positionP,$inIndexS))
|
||||||
|
$return[]=$positionP;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the Entailment-index for a matching Entailment and returns an
|
||||||
|
* array of infRule positions.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param node or null $subject
|
||||||
|
* @param node or null $predicate
|
||||||
|
* @param node or null $object
|
||||||
|
* @return array integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _findRuleEntailmentInIndex($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
$return=array();
|
||||||
|
//a node matches all entailments with NULL or a matching URI
|
||||||
|
if(is_a($subject,'Node'))
|
||||||
|
{
|
||||||
|
$subjectLabel=$subject->getLabel();
|
||||||
|
$inIndexS=array();
|
||||||
|
if (isset($this->infRulesEntailIndex['s']['null'])) $inIndexS=array_values($this->infRulesEntailIndex['s']['null']);
|
||||||
|
if (isset($this->infRulesEntailIndex['s'][$subjectLabel])) $inIndexS= array_merge($inIndexS,array_values($this->infRulesEntailIndex['s'][$subjectLabel]));
|
||||||
|
} else
|
||||||
|
//if the subject search pattern is NULL, every rule will match the subject search patter
|
||||||
|
{
|
||||||
|
$inIndexS=array_keys($this->infRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_a($predicate,'Node'))
|
||||||
|
{
|
||||||
|
$predicateLabel=$predicate->getLabel();
|
||||||
|
$inIndexP=array();
|
||||||
|
if (isset($this->infRulesEntailIndex['p']['null'])) $inIndexP=array_values($this->infRulesEntailIndex['p']['null']);
|
||||||
|
if (isset($this->infRulesEntailIndex['p'][$predicateLabel])) $inIndexP= array_merge($inIndexP,array_values($this->infRulesEntailIndex['p'][$predicateLabel]));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$inIndexP=array_keys($this->infRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_a($object,'Node'))
|
||||||
|
{
|
||||||
|
$objectLabel=$object->getLabel();
|
||||||
|
$inIndexO=array();
|
||||||
|
if (isset($this->infRulesEntailIndex['o']['null'])) $inIndexO=array_values($this->infRulesEntailIndex['o']['null']);
|
||||||
|
if (isset($this->infRulesEntailIndex['o'][$objectLabel])) $inIndexO= array_merge($inIndexO,array_values($this->infRulesEntailIndex['o'][$objectLabel]));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$inIndexO=array_keys($this->infRules);
|
||||||
|
}
|
||||||
|
|
||||||
|
//if an infrule position occurs in subject, predicate, and object index, add to result array.
|
||||||
|
foreach ($inIndexP as $positionP)
|
||||||
|
{
|
||||||
|
if (in_array($positionP,$inIndexO))
|
||||||
|
if (in_array($positionP,$inIndexS))
|
||||||
|
$return[]=$positionP;
|
||||||
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an InfRule to the InfModel.
|
||||||
|
* $statementPosition states the positiion of the statement, that created
|
||||||
|
* this rule, in the model->triples array.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object Infrule $infRule
|
||||||
|
* @param integer $statementPosition
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _addInfRule($infRule, $statementPosition)
|
||||||
|
{
|
||||||
|
//add the rule
|
||||||
|
$this->infRules[]=$infRule;
|
||||||
|
//get the position of the added rule in the model
|
||||||
|
end($this->infRules);
|
||||||
|
$rulePosition=key($this->infRules);
|
||||||
|
//add the information to the index, that this statement
|
||||||
|
//added this rule.
|
||||||
|
$this->statementRuleIndex[$statementPosition][$rulePosition]=true;
|
||||||
|
//add informations to index over trigger & entailment
|
||||||
|
$this->_addInfruleToIndex($infRule,$rulePosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,515 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfModelB
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A InfModelB extends the InfModel Class, with a backward chaining algorithm.
|
||||||
|
* Only the loaded or added base-triples are stored.
|
||||||
|
* A find-query evaluates the inference rules and recursively tries to find the statements.
|
||||||
|
* InfModelB memorises "Dead-Ends" until the next add() command, thus
|
||||||
|
* makin a second find much faster.
|
||||||
|
* InfModelB is safe for loops in Ontologies, that would cause infinite loops.
|
||||||
|
* WARNING: A find(null,null,null) might take very long.
|
||||||
|
*
|
||||||
|
* @version $Id: InfModelB.php 290 2006-06-22 12:23:24Z tgauss $
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class InfModelB extends InfModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array that holds combinations of inference rules with distinct
|
||||||
|
* find-querys, that don't lead to any inference.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $findDeadEnds;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a base_uri
|
||||||
|
*
|
||||||
|
* @param string $baseURI
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function InfModelB($baseURI = null)
|
||||||
|
{
|
||||||
|
parent::InfModel($baseURI);
|
||||||
|
$this->findDeadEnds=array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new triple to the Model without checking, if the statement
|
||||||
|
* is already in the Model. So if you want a duplicate free Model use
|
||||||
|
* the addWithoutDuplicates() function (which is slower then add())
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function add($statement)
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//Reset the found dead-ends.
|
||||||
|
$this->findDeadEnds=array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* General method to search for triples.
|
||||||
|
* NULL input for any parameter will match anything.
|
||||||
|
* Example: $result = $m->find( NULL, NULL, $node );
|
||||||
|
* Finds all triples with $node as object.
|
||||||
|
* Returns an empty MemModel if nothing is found.
|
||||||
|
* To improve the search speed with big Models, call index(INDEX_TYPE)
|
||||||
|
* before seaching.
|
||||||
|
*
|
||||||
|
* It recursively searches in the statements and rules to find
|
||||||
|
* matching statements.
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function find($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
$searchStringIndex=array();
|
||||||
|
$resultModel=new MemModel();
|
||||||
|
|
||||||
|
//add all infered statements without duplicates to the result model
|
||||||
|
foreach ($this->_infFind($subject,$predicate,$object,array())as $statement)
|
||||||
|
{
|
||||||
|
$resultModel->addWithoutDuplicates($statement);
|
||||||
|
};
|
||||||
|
return $resultModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the main inference method of the InfModelB
|
||||||
|
* The algorithm works as follows:
|
||||||
|
* Find all statements in the base model, that matches the current
|
||||||
|
* find-query.
|
||||||
|
* Check all rules, if they are able to deliver infered statements,
|
||||||
|
* that match the current find-query. Don't use rules with queries,
|
||||||
|
* that lead to dead-ends and don't use a rule-query-combination that
|
||||||
|
* was used before in this branch (ontology loops).
|
||||||
|
* If a rule is possible do deliver such statements, get a new
|
||||||
|
* find-query, that is possible to find those statements, that are able
|
||||||
|
* to trigger this rule.
|
||||||
|
* Call this _infFind method wirh the new find-query and entail the
|
||||||
|
* resulting statements.
|
||||||
|
* If this rule, wasn't able to return any statements with this distinct
|
||||||
|
* query, add this combination to the dead-ends.
|
||||||
|
* Return the statements from the base triples and those, which were infered.
|
||||||
|
*
|
||||||
|
* If $findOnlyFirstMatching is set to true, only the first match in
|
||||||
|
* the base-statements is entailed an returned (used in contains() and
|
||||||
|
* findFirstMatchingStatement() methods).
|
||||||
|
*
|
||||||
|
* You can set an offset to look for the first matching statement by setting the
|
||||||
|
* $offset var.
|
||||||
|
*
|
||||||
|
* It recursively searches in the statements and rules to find matching
|
||||||
|
* statements
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @param array $searchStringIndex
|
||||||
|
* @param boolean $findOnlyFirstMatching
|
||||||
|
* @param integer $offset
|
||||||
|
* @param integer $resultCount
|
||||||
|
* @return object array Statements
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _infFind ($subject,$predicate,$object, $searchStringIndex, $findOnlyFirstMatching = false, $offset = 0,$resultCount = 0 )
|
||||||
|
{
|
||||||
|
$return=array();
|
||||||
|
//Find all matching statements in the base statements
|
||||||
|
$findResult=parent::find($subject,$predicate,$object);
|
||||||
|
//For all found statements
|
||||||
|
foreach ($findResult->triples as $statement)
|
||||||
|
{
|
||||||
|
$return[]=$statement;
|
||||||
|
$resultCount++;
|
||||||
|
|
||||||
|
//Return, if only the firstMatchingStatement was wanted
|
||||||
|
if ($findOnlyFirstMatching && $resultCount > $offset)
|
||||||
|
return $return;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Don't infer statements about the schema (rdfs:subClass, etc..)
|
||||||
|
//is false
|
||||||
|
if ($predicate == null ||
|
||||||
|
(is_a($predicate,'Node') &&
|
||||||
|
!in_array($predicate->getLabel(),$this->supportedInference))
|
||||||
|
)
|
||||||
|
//Check only Rules, that the EntailmentIndex returned.
|
||||||
|
foreach ($this->_findRuleEntailmentInIndex($subject,$predicate,$object) as $ruleKey)
|
||||||
|
{
|
||||||
|
$infRule=$this->infRules[$ruleKey];
|
||||||
|
$serializedRuleStatement=$ruleKey.serialize($subject).serialize($predicate).serialize($object);
|
||||||
|
//If it is to ontology loop and no dead-end
|
||||||
|
if (!in_array($serializedRuleStatement, $searchStringIndex) &&
|
||||||
|
!in_array($serializedRuleStatement, $this->findDeadEnds))
|
||||||
|
{
|
||||||
|
//Keep this distinct rule query cobination for
|
||||||
|
//this branch to detect loops
|
||||||
|
$searchStringIndex[]=$serializedRuleStatement;
|
||||||
|
|
||||||
|
//If the rule is able to deliver statements that match
|
||||||
|
//this query
|
||||||
|
if ($infRule->checkEntailment($subject,$predicate,$object))
|
||||||
|
{
|
||||||
|
//Get a modified find-query, that matches statements,
|
||||||
|
//that trigger this rule
|
||||||
|
$modefiedFind=$infRule->getModifiedFind($subject,$predicate,$object);
|
||||||
|
//Call this method with the new find-query
|
||||||
|
$infFindResult=$this->_infFind($modefiedFind['s'],
|
||||||
|
$modefiedFind['p'],
|
||||||
|
$modefiedFind['o'],
|
||||||
|
$searchStringIndex,
|
||||||
|
$findOnlyFirstMatching,
|
||||||
|
$offset,
|
||||||
|
$resultCount) ;
|
||||||
|
//If it deliverd statements that matches the trigger
|
||||||
|
if (isset($infFindResult[0]))
|
||||||
|
{
|
||||||
|
foreach ($infFindResult as $statement)
|
||||||
|
{
|
||||||
|
//Entail the statements and check, if they are not about the
|
||||||
|
//ontology
|
||||||
|
$newStatement=$infRule->entail($statement);
|
||||||
|
if (!in_array($newStatement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
//Check if, the entailed statements are, what we are looking for
|
||||||
|
if($this->_nodeEqualsFind($subject,$newStatement->getSubject()) &&
|
||||||
|
$this->_nodeEqualsFind($predicate,$newStatement->getPredicate()) &&
|
||||||
|
$this->_nodeEqualsFind($object,$newStatement->getObject() ) )
|
||||||
|
{
|
||||||
|
//Add to results
|
||||||
|
$return[]=$newStatement;
|
||||||
|
$resultCount++;
|
||||||
|
|
||||||
|
//or return at once
|
||||||
|
if ($findOnlyFirstMatching && $resultCount > $offset)
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
//If there were no results of the rule-query-combination,
|
||||||
|
//mark this combination as a dead-end.
|
||||||
|
$this->findDeadEnds[]=$serializedRuleStatement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Return the array of the found statements
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if the Model contains the given triple.
|
||||||
|
* TRUE if the triple belongs to the Model;
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @param object Statement &$statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function contains(&$statement)
|
||||||
|
{
|
||||||
|
//throws an error, if $statement is not of class Statement
|
||||||
|
if(!is_a($statement,'Statement'))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: InfModelB; method: contains):
|
||||||
|
$statement has to be object of class Statement', E_USER_ERROR);
|
||||||
|
|
||||||
|
//Call the _infFind method, but let it stop, if it finds the first match.
|
||||||
|
if (count( $this->_infFind($statement->getSubject(),
|
||||||
|
$statement->getPredicate(),
|
||||||
|
$statement->getObject(),
|
||||||
|
array(),true) ) >0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches for triples and returns the first matching statement.
|
||||||
|
* NULL input for any parameter will match anything.
|
||||||
|
* Example: $result = $m->findFirstMatchingStatement( NULL, NULL, $node );
|
||||||
|
* Returns the first statement of the MemModel where the object equals $node.
|
||||||
|
* Returns an NULL if nothing is found.
|
||||||
|
* You can define an offset to search for. Default = 0
|
||||||
|
*
|
||||||
|
* @param object Node $subject
|
||||||
|
* @param object Node $predicate
|
||||||
|
* @param object Node $object
|
||||||
|
* @param integer $offset
|
||||||
|
* @return object Statement
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function findFirstMatchingStatement($subject, $predicate, $object, $offset = 0)
|
||||||
|
{
|
||||||
|
//Call the _infFind method, but let it stop, if it finds the
|
||||||
|
//first match.
|
||||||
|
$res= $this->_infFind($subject,$predicate,$object,array(),true,$offset);
|
||||||
|
|
||||||
|
if (isset($res[$offset]))
|
||||||
|
{
|
||||||
|
return $res[$offset];
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a StatementIterator for traversing the Model.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object StatementIterator
|
||||||
|
*/
|
||||||
|
function & getStatementIterator()
|
||||||
|
{
|
||||||
|
// Import Package Utility
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_UTILITY);
|
||||||
|
// Gets a MemModel by executing a find(null,null,null) to get a
|
||||||
|
//inferable statements.
|
||||||
|
// WARNING: might be slow
|
||||||
|
return new StatementIterator($this->getMemModel());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of all inferable triples in the Model.
|
||||||
|
* WARNING: uses a find(null,null,null) to find all statements! (might take a while)
|
||||||
|
*
|
||||||
|
* @param boolean
|
||||||
|
* @return integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function size()
|
||||||
|
{
|
||||||
|
// Gets a MemModel by executing a find(null,null,null) to get a
|
||||||
|
//inferable statements.
|
||||||
|
// WARNING: might be slow
|
||||||
|
$res = $this->getMemModel();
|
||||||
|
return $res->size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing all the triples (including inferred
|
||||||
|
* statements) of the current InfModelB.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function & getMemModel()
|
||||||
|
{
|
||||||
|
|
||||||
|
$return=$this->find(null,null,null);
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
$return->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing only the base triples (without inferred
|
||||||
|
* statements) of the current InfModelB.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function & getBaseMemModel()
|
||||||
|
{
|
||||||
|
$return= new MemModel();
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
foreach ($this->triples as $statement)
|
||||||
|
$return->add($statement);
|
||||||
|
|
||||||
|
$retun->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short Dump of the InfModelB.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toString()
|
||||||
|
{
|
||||||
|
return 'InfModelB[baseURI=' . $this->getBaseURI() . '; size=' . $this->size(true) . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps of the InfModelB including ALL inferable triples.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toStringIncludingTriples()
|
||||||
|
{
|
||||||
|
$dump = $this->toString() . chr(13);
|
||||||
|
$stateIt=new StatementIterator($this->find(null,null,null));
|
||||||
|
while($statement=$stateIt->next())
|
||||||
|
{
|
||||||
|
$dump .= $statement->toString() . chr(13);
|
||||||
|
}
|
||||||
|
return $dump;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the RDF,N3 or N-Triple serialization of the full InfModelB
|
||||||
|
* (including inferred triples) to a file.
|
||||||
|
* You can decide to which format the model should be serialized by
|
||||||
|
* using a corresponding suffix-string as $type parameter. If no $type
|
||||||
|
* parameter is placed this method will serialize the model to XML/RDF
|
||||||
|
* format.
|
||||||
|
* Returns FALSE if the InfModelB couldn't be saved to the file.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $filename
|
||||||
|
* @param string $type
|
||||||
|
* @throws PhpError
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function saveAs($filename, $type ='rdf')
|
||||||
|
{
|
||||||
|
|
||||||
|
$memmodel=$this->getMemModel();
|
||||||
|
return $memmodel->saveAs($filename, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the RDF serialization of the Model including ALL inferable
|
||||||
|
* triples as HTML.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function writeAsHtml()
|
||||||
|
{
|
||||||
|
require_once(RDFAPI_INCLUDE_DIR.PACKAGE_SYNTAX_RDF);
|
||||||
|
$ser = new RdfSerializer();
|
||||||
|
$rdf =& $ser->serialize($this->getMemModel());
|
||||||
|
$rdf = htmlspecialchars($rdf, ENT_QUOTES);
|
||||||
|
$rdf = str_replace(' ', ' ', $rdf);
|
||||||
|
$rdf = nl2br($rdf);
|
||||||
|
echo $rdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the RDF serialization of the Model including ALL inferable
|
||||||
|
* triples as HTML table.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function writeAsHtmlTable()
|
||||||
|
{
|
||||||
|
// Import Package Utility
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_UTILITY);
|
||||||
|
RDFUtil::writeHTMLTable($this->getMemModel());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the RDF serialization of the Model including ALL inferable
|
||||||
|
* triples.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function writeRdfToString()
|
||||||
|
{
|
||||||
|
// Import Package Syntax
|
||||||
|
include_once(RDFAPI_INCLUDE_DIR.PACKAGE_SYNTAX_RDF);
|
||||||
|
$ser = new RdfSerializer();
|
||||||
|
$rdf =& $ser->serialize($this->getMemModel());
|
||||||
|
return $rdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the triple from the MemModel.
|
||||||
|
* TRUE if the triple is removed.
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* Checks, if it touches any statements, that added inference rules
|
||||||
|
* to the model.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function remove($statement)
|
||||||
|
{
|
||||||
|
if (parent::contains($statement))
|
||||||
|
{
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference));
|
||||||
|
while (count($this->_removeFromInference($statement))>0);
|
||||||
|
|
||||||
|
$this->findDeadEnds=array();
|
||||||
|
return parent::remove($statement);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, if a single node matches a single find pattern.
|
||||||
|
* TRUE if the node matches.
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* Checks, if it touches any statements, that added inference rules
|
||||||
|
* to the model.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _nodeEqualsFind(& $find, $node)
|
||||||
|
{
|
||||||
|
//If the find pattern is a node, use the nodes equal-method and
|
||||||
|
//return the result.
|
||||||
|
if (is_a($find,'Node'))
|
||||||
|
return $node->equals($find);
|
||||||
|
|
||||||
|
//Null-pattern matches anything.
|
||||||
|
if ($find == null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a FindIterator for traversing the MemModel.
|
||||||
|
* Disabled in InfModelB.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object FindIterator
|
||||||
|
*/
|
||||||
|
function & findAsIterator($sub=null,$pred=null,$obj=null) {
|
||||||
|
$errmsg = RDFAPI_ERROR . '(class: InfModelB; method: findAsIterator):
|
||||||
|
This function is disabled in the
|
||||||
|
Inference Model';
|
||||||
|
trigger_error($errmsg, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,406 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfModelF
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A InfModelF extends the InfModel Class, with a forward chaining algorithm.
|
||||||
|
* If a new statement is added, it is enferd at
|
||||||
|
* once and all the entailed statements are added too.
|
||||||
|
* When adding or removing a statement, that produced a new inference rule,
|
||||||
|
* all entailed statements are discarded and the whole base model is infered
|
||||||
|
* again.
|
||||||
|
* The InfModelF is safe for loops in Ontologies, that would cause infinite loops.
|
||||||
|
*
|
||||||
|
* @version $Id: InfModelF.php 320 2006-11-21 09:38:51Z tgauss $
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class InfModelF extends InfModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array that holds the position of the infered statements in the model.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $infPos;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable that influences the habbit when adding statements.
|
||||||
|
* Used by the loadModel method to increase performance.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $inferenceEnabled;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* You can supply a base_uri.
|
||||||
|
*
|
||||||
|
* @param string $baseURI
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function InfModelF($baseURI = NULL)
|
||||||
|
{
|
||||||
|
parent::InfModel($baseURI);
|
||||||
|
$this->infPos=array();
|
||||||
|
$this->inferenceEnabled=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new triple to the MemModel without checking if the statement
|
||||||
|
* is already in the MemModel.
|
||||||
|
* So if you want a duplicate free MemModel use the addWithoutDuplicates()
|
||||||
|
* function (which is slower then add())
|
||||||
|
* The statement is infered and all entailed statements are added.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function add ($statement)
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
if ($this->inferenceEnabled)
|
||||||
|
{
|
||||||
|
foreach ($this->entailStatement($statement) as $state)
|
||||||
|
{
|
||||||
|
//a addWithoutDublicates construct
|
||||||
|
if(!$this->contains($state))
|
||||||
|
{
|
||||||
|
|
||||||
|
parent::add($state);
|
||||||
|
//save the position of the infered statements
|
||||||
|
end($this->triples);
|
||||||
|
$this->infPos[]=key($this->triples);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
//apply the complete inference to the model, if the added statement was able to add a rule
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a new statement is already in the MemModel and adds
|
||||||
|
* the statement, if it is not in the MemModel.
|
||||||
|
* addWithoutDuplicates() is significantly slower then add().
|
||||||
|
* Retruns TRUE if the statement is added.
|
||||||
|
* FALSE otherwise.
|
||||||
|
* The statement is infered and all entailed statements are added.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function addWithoutDuplicates(& $statement)
|
||||||
|
{
|
||||||
|
if(!$this->contains($statement))
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
if ($this->inferenceEnabled)
|
||||||
|
{
|
||||||
|
foreach ($this->entailStatement($statement) as $statement)
|
||||||
|
{
|
||||||
|
if(!$this->contains($statement))
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//save the position of the infered statements
|
||||||
|
end($this->triples);
|
||||||
|
$this->infPos[]=key($this->triples);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entails every statement and adds the entailments if not already
|
||||||
|
* in the model.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function applyInference()
|
||||||
|
{
|
||||||
|
//check every statement in the model
|
||||||
|
foreach ($this->triples as $statement)
|
||||||
|
{
|
||||||
|
//gat all statements, that it recursively entails
|
||||||
|
foreach ($this->entailStatement($statement) as $statement)
|
||||||
|
{
|
||||||
|
if (!$this->contains($statement))
|
||||||
|
{
|
||||||
|
parent::add($statement);
|
||||||
|
//add the InfStatement position to the index
|
||||||
|
end($this->triples);
|
||||||
|
$this->infPos[]=key($this->triples);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entails a statement by recursively using the _entailStatementRec
|
||||||
|
* method.
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return array of statements
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function entailStatement (& $statement)
|
||||||
|
{
|
||||||
|
$infStatementsIndex=array();
|
||||||
|
return $this->_entailStatementRec($statement,$infStatementsIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursive method, that checks the statement with the trigger of
|
||||||
|
* every rule. If the trigger matches and entails new statements,
|
||||||
|
* those statements are recursively infered too.
|
||||||
|
* The $infStatementsIndex array holds lready infered statements
|
||||||
|
* to prevent infinite loops.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @param array $infStatementsIndex
|
||||||
|
* @return array of statements
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _entailStatementRec ( $statement,& $infStatementsIndex)
|
||||||
|
{
|
||||||
|
$infStatements = array();
|
||||||
|
$return = array();
|
||||||
|
|
||||||
|
//dont entail statements about the supported inference-schema
|
||||||
|
if (!in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
{
|
||||||
|
//check only the rules, that were returned by the index
|
||||||
|
foreach ($this->_findRuleTriggerInIndex($statement) as $key )
|
||||||
|
{
|
||||||
|
$infRule=$this->infRules[$key];
|
||||||
|
|
||||||
|
$stateString=$key.serialize($statement);
|
||||||
|
//If the statement wasn't infered before
|
||||||
|
if (!in_array($stateString,$infStatementsIndex))
|
||||||
|
{
|
||||||
|
$infStatementsIndex[]=$stateString;
|
||||||
|
//Check, if the Statements triggers this rule
|
||||||
|
if($infRule->checkTrigger($statement))
|
||||||
|
{
|
||||||
|
$infStatement=$infRule->entail($statement);
|
||||||
|
#if(!$this->contains($infStatement))
|
||||||
|
{
|
||||||
|
$return[]=$infStatement;
|
||||||
|
$return=array_merge($return,
|
||||||
|
$this->_entailStatementRec($infStatement,
|
||||||
|
$infStatementsIndex));
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all infered statements from the model but keeps the
|
||||||
|
* infernece rules.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function removeInfered()
|
||||||
|
{
|
||||||
|
$indexTmp=$this->indexed;
|
||||||
|
$this->index(-1);
|
||||||
|
foreach ($this->infPos as $key)
|
||||||
|
{
|
||||||
|
unset($this->triples[$key]);
|
||||||
|
};
|
||||||
|
$this->infPos=array();
|
||||||
|
$this->index($indexTmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a model from a file containing RDF, N3 or N-Triples.
|
||||||
|
* This function recognizes the suffix of the filename (.n3 or .rdf) and
|
||||||
|
* calls a suitable parser, if no $type is given as string
|
||||||
|
* ("rdf" "n3" "nt");
|
||||||
|
* If the model is not empty, the contents of the file is added to
|
||||||
|
* this DbModel.
|
||||||
|
*
|
||||||
|
* While loading the model, the inference entailing is disabled, but
|
||||||
|
* new inference rules are added to increase performance.
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* @param string $type
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function load($filename, $type = NULL)
|
||||||
|
{
|
||||||
|
//Disable entailing to increase performance
|
||||||
|
$this->inferenceEnabled=false;
|
||||||
|
parent::load($filename, $type);
|
||||||
|
//Enable entailing
|
||||||
|
$this->inferenceEnabled=true;
|
||||||
|
//Entail all statements
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short Dump of the InfModelF.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function toString() {
|
||||||
|
return 'InfModelF[baseURI=' . $this->getBaseURI() . ';
|
||||||
|
size=' . $this->size(true) . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing all the triples (including inferred
|
||||||
|
* statements) of the current InfModelF.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function & getMemModel()
|
||||||
|
{
|
||||||
|
$return= new MemModel();
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
foreach ($this->triples as $statement)
|
||||||
|
$return->add($statement);
|
||||||
|
|
||||||
|
$return->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MemModel containing only the base triples
|
||||||
|
* (without inferred statements) of the current InfModelF.
|
||||||
|
*
|
||||||
|
* @return object MemModel
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getBaseMemModel()
|
||||||
|
{
|
||||||
|
$return= new MemModel();
|
||||||
|
$return->setBaseURI($this->baseURI);
|
||||||
|
foreach ($this->triples as $key => $statement)
|
||||||
|
if (!in_array($key,$this->infPos))
|
||||||
|
$return->add($statement);
|
||||||
|
$retun->addParsedNamespaces($this->getParsedNamespaces());
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the triple from the MemModel.
|
||||||
|
* TRUE if the triple is removed.
|
||||||
|
* FALSE otherwise.
|
||||||
|
*
|
||||||
|
* Checks, if it touches any statements, that added inference rules
|
||||||
|
* to the model
|
||||||
|
*
|
||||||
|
* @param object Statement $statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function remove($statement)
|
||||||
|
{
|
||||||
|
//If the statement is in the model
|
||||||
|
if($this->contains($statement))
|
||||||
|
{
|
||||||
|
$inferenceRulesWereTouched=false;
|
||||||
|
//If the statement was able to add inference rules
|
||||||
|
if (in_array($statement->getLabelPredicate(),$this->supportedInference))
|
||||||
|
{
|
||||||
|
$statementPositions=$this->_removeFromInference($statement);
|
||||||
|
$inferenceRulesWereTouched=true;
|
||||||
|
} else
|
||||||
|
//get the position of all matching statements
|
||||||
|
{
|
||||||
|
$statementPositions=array();
|
||||||
|
//find the positions of the statements
|
||||||
|
$statementPosition=-1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
|
||||||
|
$statementPosition =
|
||||||
|
$this->findFirstMatchOff($statement->getSubject(),
|
||||||
|
$statement->getPredicate(),
|
||||||
|
$statement->getObject(),
|
||||||
|
$statementPosition+1);
|
||||||
|
|
||||||
|
if ($statementPosition!=-1)
|
||||||
|
$statementPositions[]=$statementPosition;
|
||||||
|
|
||||||
|
} while ($statementPosition != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove matching statements
|
||||||
|
parent::remove($statement);
|
||||||
|
foreach ($statementPositions as $statementPosition)
|
||||||
|
{
|
||||||
|
//if the statement was infered, remove it from the index of the infered statements.
|
||||||
|
if (in_array($statementPosition,$this->infPos))
|
||||||
|
unset ($this->infPos[$statementPosition]);
|
||||||
|
}
|
||||||
|
if ($inferenceRulesWereTouched)
|
||||||
|
{
|
||||||
|
//remove the statement and re-entail the model
|
||||||
|
$this->removeInfered();
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds another model to this MemModel.
|
||||||
|
* Duplicate statements are not removed.
|
||||||
|
* If you don't want duplicates, use unite().
|
||||||
|
* If any statement of the model to be added to this model contains a blankNode
|
||||||
|
* with an identifier already existing in this model, a new blankNode is generated.
|
||||||
|
*
|
||||||
|
* @param object Model $model
|
||||||
|
* @access public
|
||||||
|
* @throws phpErrpr
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function addModel(&$model)
|
||||||
|
{
|
||||||
|
//Disable entailing to increase performance
|
||||||
|
$this->inferenceEnabled=false;
|
||||||
|
parent::addModel($model);
|
||||||
|
//Enable entailing
|
||||||
|
$this->inferenceEnabled=true;
|
||||||
|
//Entail all statements
|
||||||
|
$this->applyInference();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
?>
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// InfModel Package
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Description : InfModel package
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Author: Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Include InfModel classes
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfRule.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfStatement.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfModel.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfModelB.php');
|
||||||
|
require_once( RDFAPI_INCLUDE_DIR . 'infModel/InfModelF.php');
|
||||||
|
?>
|
||||||
@ -0,0 +1,343 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfRule
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class represents a single rule in a RDFS inference model.
|
||||||
|
* It primary constists of a trigger and an entailment.
|
||||||
|
* In the forward-chaining mode (RDFSFModel) a statement is checked,
|
||||||
|
* if it satisfies the trigger. If it does, a new statement is returned.
|
||||||
|
* In the backward-chaining mode (RDFSBModel) a find-query is checked
|
||||||
|
* with the entailment. If this entailment could satify the find-query,
|
||||||
|
* a new find-query is returned, that searches for statements that
|
||||||
|
* satisfy the trigger of this rule.
|
||||||
|
*
|
||||||
|
* @version $Id: InfRule.php 290 2006-06-22 12:23:24Z tgauss $
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
|
||||||
|
*
|
||||||
|
* @package infModel
|
||||||
|
* @access public
|
||||||
|
**/
|
||||||
|
|
||||||
|
class InfRule
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array, that hold the trigger subject in key ['s'], the trigger
|
||||||
|
* predicate in ['p'], and the trigger object in ['o'].
|
||||||
|
* The array values can be NULL to match anything or be a node that
|
||||||
|
* has to be matched.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $trigger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array, that hold the entailment subject in key ['s'], the
|
||||||
|
* entailment predicate in ['p'], and the entailment object in ['o'].
|
||||||
|
* The array values can be a node that will be inserted in the
|
||||||
|
* returning statement, or '<s>' to insert the subject,'<p>' to insert
|
||||||
|
* the predicate, or '<o>' to insert the object of the checked statement
|
||||||
|
* to this position in the new returned statement.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $entailment;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function infRule()
|
||||||
|
{
|
||||||
|
//initialising vars
|
||||||
|
$this->trigger=array();
|
||||||
|
$this->entailment=array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the trigger of this rule
|
||||||
|
* The values can be NULL to match anything or be a node that has to
|
||||||
|
* be matched.
|
||||||
|
*
|
||||||
|
* @param object Node OR NULL $subject
|
||||||
|
* @param object Node OR NULL $predicate
|
||||||
|
* @param object Node OR NULL $object
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function setTrigger ($subject, $predicate, $object)
|
||||||
|
{
|
||||||
|
//throw an error if subject, predicate, or object are neither
|
||||||
|
//node, nor null.
|
||||||
|
if(!is_a($subject,'Node') && $subject != null)
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setTrigger): $subject has to be null or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($predicate,'Node') && $predicate != null)
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setTrigger): $predicate has to be null or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($object,'Node') && $object != null)
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setTrigger): $object has to be null or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
|
||||||
|
//set the trigger
|
||||||
|
$this->trigger['s']=$subject;
|
||||||
|
$this->trigger['p']=$predicate;
|
||||||
|
$this->trigger['o']=$object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the entailment of this rule
|
||||||
|
* The values can be NULL to match anything or be a node that has to
|
||||||
|
* be matched.
|
||||||
|
*
|
||||||
|
* @param object Node OR NULL $subject
|
||||||
|
* @param object Node OR NULL $predicate
|
||||||
|
* @param object Node OR NULL $object
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function setEntailment($subject,$predicate,$object)
|
||||||
|
{
|
||||||
|
//throw an error if subject, predicate, or object are neither node,
|
||||||
|
//nor <s>,<p>,<o>.
|
||||||
|
if(!is_a($subject,'Node') && !ereg('<[spo]>', $subject))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setEntailment): $subject has to be <s>,<p>,or <o> or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($predicate,'Node') && !ereg('<[spo]>', $predicate))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setEntailment): $predicate has to be <s>,<p>,or <o> or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
if(!is_a($object,'Node') && !ereg('<[spo]>', $object))
|
||||||
|
trigger_error(RDFAPI_ERROR . '(class: Infrule; method:
|
||||||
|
setEntailment): $object has to be <s>,<p>,or <o> or of class Node'
|
||||||
|
, E_USER_ERROR);
|
||||||
|
|
||||||
|
$this->entailment['s']=$subject;
|
||||||
|
$this->entailment['p']=$predicate;
|
||||||
|
$this->entailment['o']=$object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, if the statement satisfies the trigger.
|
||||||
|
*
|
||||||
|
* @param object Statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function checkTrigger(& $statement)
|
||||||
|
{
|
||||||
|
//is true, if the trigger is null to match anything
|
||||||
|
//or equals the statement's subject
|
||||||
|
$shouldFireS = $this->trigger['s'] == null ||
|
||||||
|
$this->trigger['s']->equals($statement->getSubject());
|
||||||
|
|
||||||
|
//is true, if the trigger is null to match anything
|
||||||
|
//or equals the statement's predicate
|
||||||
|
$shouldFireP = $this->trigger['p'] == null ||
|
||||||
|
$this->trigger['p']->equals($statement->getPredicate());
|
||||||
|
|
||||||
|
//is true, if the trigger is null to match anything
|
||||||
|
//or equals the statement's object
|
||||||
|
$shouldFireO = $this->trigger['o'] == null ||
|
||||||
|
$this->trigger['o']->equals($statement->getObject());
|
||||||
|
|
||||||
|
//returns true, if ALL are true
|
||||||
|
return $shouldFireS && $shouldFireP && $shouldFireO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, if this rule could entail a statement that matches
|
||||||
|
* a find of $subject,$predicate,$object.
|
||||||
|
*
|
||||||
|
* @param object Statement
|
||||||
|
* @return boolean
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function checkEntailment ($subject, $predicate, $object)
|
||||||
|
{
|
||||||
|
//true, if $subject is null, the entailment's subject matches
|
||||||
|
//anything, or the $subject equals the entailment-subject.
|
||||||
|
$matchesS= $subject == null ||
|
||||||
|
!is_a($this->entailment['s'],'Node') ||
|
||||||
|
$this->entailment['s']->equals($subject);
|
||||||
|
|
||||||
|
//true, if $predicate is null, the entailment's predicate matches
|
||||||
|
//anything, or the $predicate equals the entailment-predicate.
|
||||||
|
$matchesP= $predicate == null ||
|
||||||
|
!is_a($this->entailment['p'],'Node') ||
|
||||||
|
$this->entailment['p']->equals($predicate);
|
||||||
|
|
||||||
|
//true, if $object is null, the entailment's object matches
|
||||||
|
//anything, or the $object equals the entailment-object.
|
||||||
|
$matchesO= $object == null ||
|
||||||
|
!is_a($this->entailment['o'],'Node') ||
|
||||||
|
$this->entailment['o']->equals($object);
|
||||||
|
|
||||||
|
//returns true, if ALL are true
|
||||||
|
return $matchesS && $matchesP && $matchesO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a infered InfStatement by evaluating the statement with
|
||||||
|
* the entailment rule.
|
||||||
|
*
|
||||||
|
* @param object Statement
|
||||||
|
* @return object InfStatement
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function entail(& $statement)
|
||||||
|
{
|
||||||
|
//if the entailment's subject is <s>,<p>,or <o>, put the statements
|
||||||
|
//subject,predicate,or object into the subject of the
|
||||||
|
//entailed statement. If the entailment's subject is a node,
|
||||||
|
//add that node to the statement.
|
||||||
|
switch ($this->entailment['s'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$entailedSubject=$statement->getSubject();
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$entailedSubject=$statement->getPredicate();
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$entailedSubject=$statement->getObject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$entailedSubject=$this->entailment['s'];
|
||||||
|
};
|
||||||
|
|
||||||
|
//if the entailment's predicate is <s>,<p>,or <o>, put the
|
||||||
|
//statements subject,predicate,or object into the predicate of
|
||||||
|
//the entailed statement. If the entailment's predicate is a node,
|
||||||
|
//add that node to the statement.
|
||||||
|
switch ($this->entailment['p'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$entailedPredicate=$statement->getSubject();
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$entailedPredicate=$statement->getPredicate();
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$entailedPredicate=$statement->getObject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$entailedPredicate=$this->entailment['p'];
|
||||||
|
};
|
||||||
|
|
||||||
|
//if the entailment's object is <s>,<p>,or <o>, put the
|
||||||
|
//statements subject,predicate,or object into the object of
|
||||||
|
//the entailed statement. If the entailment's object is a node,
|
||||||
|
//add that node to the statement.
|
||||||
|
switch ($this->entailment['o'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$entailedObject=$statement->getSubject();
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$entailedObject=$statement->getPredicate();
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$entailedObject=$statement->getObject();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$entailedObject=$this->entailment['o'];
|
||||||
|
};
|
||||||
|
|
||||||
|
//return the infered statement
|
||||||
|
return (new InfStatement($entailedSubject,$entailedPredicate,$entailedObject));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a find-query that matches statements, whose entailed
|
||||||
|
* statements would match the supplied find query.
|
||||||
|
*
|
||||||
|
* @param Node OR null $subject
|
||||||
|
* @param Node OR null $predicate
|
||||||
|
* @param Node OR null $object
|
||||||
|
* @return array
|
||||||
|
* @access public
|
||||||
|
* @throws PhpError
|
||||||
|
*/
|
||||||
|
function getModifiedFind( $subject, $predicate, $object)
|
||||||
|
{
|
||||||
|
$findSubject=$this->trigger['s'];
|
||||||
|
$findPredicate=$this->trigger['p'];
|
||||||
|
$findObject=$this->trigger['o'];
|
||||||
|
|
||||||
|
switch ($this->entailment['s'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$findSubject=$subject;
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$findPredicate=$subject;
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$findObject=$subject;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
switch ($this->entailment['p'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$findSubject=$predicate;
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$findPredicate=$predicate;
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$findObject=$predicate;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
switch ($this->entailment['o'])
|
||||||
|
{
|
||||||
|
case '<s>':
|
||||||
|
$findSubject=$object;
|
||||||
|
break;
|
||||||
|
case '<p>':
|
||||||
|
$findPredicate=$object;
|
||||||
|
break;
|
||||||
|
case '<o>':
|
||||||
|
$findObject=$object;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
return array('s' => $findSubject,
|
||||||
|
'p' => $findPredicate,
|
||||||
|
'o' => $findObject );
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTrigger()
|
||||||
|
{
|
||||||
|
return array ( 's' => $this->trigger['s'],
|
||||||
|
'p' => $this->trigger['p'],
|
||||||
|
'o' => $this->trigger['o'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEntailment()
|
||||||
|
{
|
||||||
|
return array ( 's' => $this->entailment['s'],
|
||||||
|
'p' => $this->entailment['p'],
|
||||||
|
'o' => $this->entailment['o'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Class: InfStatement
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An RDF statement which was entailed by a inference rule.
|
||||||
|
* See Statement Class for further information.
|
||||||
|
*
|
||||||
|
* @author Daniel Westphal <mail at d-westphal dot de>
|
||||||
|
* @version $Id: InfStatement.php 268 2006-05-15 05:28:09Z tgauss $
|
||||||
|
* @package infModel
|
||||||
|
*/
|
||||||
|
class InfStatement extends Statement {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user