Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
bff39ba
Added Java folder with IJava
deKlerk May 21, 2019
6b70d03
replaced updated Readme file
deKlerk May 21, 2019
1bcc1a5
updated link to binder
deKlerk May 21, 2019
b83646f
updated requirements and palced the dockerfile in the root of the rep…
deKlerk May 23, 2019
dae0d37
corrected link to binder in Readme
deKlerk May 23, 2019
067bb7a
Updated Readme
deKlerk May 23, 2019
8c5a56e
Acknowledgement to Spencer Park for IJava-Binder scripts in Readme
deKlerk May 23, 2019
0315e38
Added Jena installation to Dockerfile
deKlerk May 23, 2019
abc0ebc
Small correction in the Dockerfile
deKlerk May 23, 2019
aa96166
Updated Dockerfile, fixing java CLASSPATH and installing Fuseki
deKlerk May 23, 2019
e6992d8
Updating java -classpath call
deKlerk May 23, 2019
8aaa553
commented out installation of Jena packages
deKlerk May 23, 2019
f4451a3
Fixed security vulnerability in python module jupyterhub
deKlerk May 24, 2019
bca12f1
Added JenaRoadTest notebook
deKlerk May 31, 2019
7607a01
testing Jena RDF/XML
jakob-beetz Jun 16, 2019
988aa36
added BOT reasoning example for Jena notebooks
jakob-beetz Jun 16, 2019
d737832
Update README.md
jakob-beetz Jun 16, 2019
53a1c25
minor setup corrections
jakob-beetz Jun 16, 2019
fbb2061
Merge branch 'multiKernel' of https://github.com/jakob-beetz/SummerSc…
jakob-beetz Jun 16, 2019
4566d71
clean up BOT reasonging examples
jakob-beetz Jun 17, 2019
8aceb11
Update README.md
jakob-beetz Jun 17, 2019
7f25660
Merge pull request #39 from jakob-beetz/multiKernel
GeorgFerdinandSchneider Jun 17, 2019
f42145a
update of hello jena example
jakob-beetz Jun 18, 2019
0586021
update of hello jena example
jakob-beetz Jun 18, 2019
df61055
Merge branch 'multiKernel' of https://github.com/jakob-beetz/SummerSc…
jakob-beetz Jun 18, 2019
0549815
Merge pull request #62 from jakob-beetz/multiKernel
jakob-beetz Jun 18, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Intellij

*.iml
.idea

.ipynb_checkpoints/

# virtualenv
env/
64 changes: 64 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
FROM openjdk:11.0.3-jdk
MAINTAINER Rui de Klerk <rui.klerk@campus.ul.pt>

# Dockerfile copied and adapted from Spencer Park: https://github.com/SpencerPark/ijava-binder/blob/master/Dockerfile

RUN apt-get update
RUN apt-get install -y python3-pip

# add requirements.txt, written this way to gracefully ignore a missing file
COPY . .
RUN ([ -f requirements.txt ] \
&& pip3 install --no-cache-dir -r requirements.txt) \
|| pip3 install --no-cache-dir jupyter jupyterlab

USER root

# Download the kernel release
RUN curl -L https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip > ijava-kernel.zip

# Unpack and install the kernel
RUN unzip ijava-kernel.zip -d ijava-kernel \
&& cd ijava-kernel \
&& python3 install.py --sys-prefix

# -- WIP --
# Download Apache Jena
#RUN curl -L http://mirrors.up.pt/pub/apache/jena/binaries/apache-jena-3.11.0.zip > apache-jena-3.11.0.zip

# Unpack and install Jena
#RUN unzip apache-jena-3.11.0.zip -d apache-jena

# Download Apache Jena Fuseki
#RUN curl -L http://mirrors.up.pt/pub/apache/jena/binaries/apache-jena-fuseki-3.11.0.zip > apache-jena-fuseki-3.11.0.zip

# Unpack and install Apache Jena Fuseki
#RUN unzip apache-jena-fuseki-3.11.0.zip -d fuseki
# -- WIP --

# Set up the user environment

#ENV IJAVA_CLASSPATH apache-jena/lib/* ; fuseki/lib/*

ENV NB_USER jovyan
ENV NB_UID 1000
ENV HOME /home/$NB_USER

# -- WIP --
#RUN java -classpath apache-jena/lib/* ;\
# fuseki/lib/*
# -- WIP --

RUN adduser --disabled-password \
--gecos "Default user" \
--uid $NB_UID \
$NB_USER

COPY . $HOME
RUN chown -R $NB_UID $HOME

USER $NB_USER

# Launch the notebook server
WORKDIR $HOME
CMD ["jupyter", "notebook", "--ip", "0.0.0.0"]
199 changes: 199 additions & 0 deletions Java Notebooks/3rdPartyDependency.ipynb

Large diffs are not rendered by default.

310 changes: 310 additions & 0 deletions Java Notebooks/BOT_reasoning.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,310 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Jena Reasoning on a simple BOT instance\n",
"\n",
"In order to run Jena using the IJava kernel on Jupyter notebooks, first we need to use some [IJava Magics](https://github.com/SpencerPark/IJava/blob/7f5aa9ab858859a010fd228364b080606399ae60/docs/magics.md#line-magic-2) to load it:\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%%loadFromPOM\n",
"<dependency>\n",
" <groupId>org.apache.jena</groupId>\n",
" <artifactId>apache-jena-libs</artifactId>\n",
" <type>pom</type>\n",
" <version>3.11.0</version>\n",
"</dependency>"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%%loadFromPOM\n",
"<dependencies>\n",
" <dependency>\n",
" <groupId> org.apache.cassandra</groupId>\n",
" <artifactId>cassandra-all</artifactId>\n",
" <version>0.8.1</version>\n",
"\n",
" <exclusions>\n",
" <exclusion> \n",
" <groupId>org.slf4j</groupId>\n",
" <artifactId>slf4j-log4j12</artifactId>\n",
" </exclusion>\n",
" <exclusion> \n",
" <groupId>log4j</groupId>\n",
" <artifactId>log4j</artifactId>\n",
" </exclusion>\n",
" </exclusions> \n",
"\n",
" </dependency>\n",
"</dependencies>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setting up Jena \n",
"\n",
"first, lets import all the Classes we will need for reasoning"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import org.apache.jena.reasoner.*;\n",
"import org.apache.jena.rdf.model.InfModel;\n",
"import org.apache.jena.rdf.model.Statement;\n",
"import org.apache.jena.util.*;\n",
"import org.apache.jena.rdf.model.*;\n",
"import org.apache.jena.ontology.*;\n",
"import org.apache.jena.vocabulary.OWL ;\n",
"import org.apache.jena.vocabulary.RDF ;\n",
"import org.apache.jena.vocabulary.RDFS;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load an ABox from the the documentation example\n",
"Now,load a simple model that has been created similar to the example in the BOT documentation on https://w3c-lbd-cg.github.io/bot/?tab=0#two-storey-building \n",
"\n",
"This is provided in the `../data` directory\n",
"\n",
"it consist of just a number of statements:\n",
"\n",
"```\n",
":SiteA a bot:Site ;\n",
" bot:hasBuilding :BuildingA .\n",
" \n",
":BuildingA bot:hasStorey :Storey00 , :Storey01 .\n",
"\n",
":Storey00 bot:hasSpace :SpaceA , :SpaceB .\n",
"\n",
":Storey01 bot:hasSpace :SpaceC , :SpaceD .\n",
"```\n",
"\n",
"Let's print out what is known abou the :BuildingA\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/***************** facts BEFORE inference ****************/\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#hasStorey> <https://ldac.org/house#Storey01>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#hasStorey> <https://ldac.org/house#Storey00>)\n"
]
}
],
"source": [
"// load a simple instance file from the example az\n",
"// https://w3c-lbd-cg.github.io/bot/?tab=0#two-storey-building\n",
"/****** the A-BOX *************/\n",
"Model simple_house = FileManager.get().loadModel(\"../data/simple_bot.ttl\");\n",
"System.out.println (\"/***************** facts BEFORE inference ****************/\");\n",
"Resource Site = simple_house.getResource(\"https://ldac.org/house#BuildingA\");\n",
"for (StmtIterator i = ((Model)simple_house).listStatements(new SimpleSelector( Site, null, (RDFNode)null )); i.hasNext();){\n",
" Statement stmt = i.nextStatement();\n",
" System.out.println (PrintUtil.print(stmt));\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load the BOT TBox \n",
"Up to know, these are just the \"stupid\" facts asserted in the above snipptes. No knowledge about what the Resources actually are is present at present. \n",
"\n",
"In a second step the TBOX is loaded directly from its source.\n",
"\n",
"A Reasoner is created in that combines TBox and Abox and starts to make inferences"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"/***************** facts AFTER inference ****************/\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#hasStorey> <https://ldac.org/house#Storey01>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#hasStorey> <https://ldac.org/house#Storey00>)\n",
"(<https://ldac.org/house#BuildingA> rdf:type owl:Thing)\n",
"(<https://ldac.org/house#BuildingA> rdf:type <https://w3id.org/bot#Building>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#containsZone> <https://ldac.org/house#Storey01>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#containsZone> <https://ldac.org/house#Storey00>)\n",
"(<https://ldac.org/house#BuildingA> rdf:type <https://w3id.org/bot#Zone>)\n",
"(<https://ldac.org/house#BuildingA> rdf:type rdfs:Resource)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#containsZone> <https://ldac.org/house#SpaceD>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#containsZone> <https://ldac.org/house#SpaceC>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#containsZone> <https://ldac.org/house#SpaceB>)\n",
"(<https://ldac.org/house#BuildingA> <https://w3id.org/bot#containsZone> <https://ldac.org/house#SpaceA>)\n",
"(<https://ldac.org/house#BuildingA> owl:sameAs <https://ldac.org/house#BuildingA>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#SpaceD>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#SpaceC>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#SpaceB>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#SpaceA>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#Storey01>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#Storey00>)\n",
"(<https://ldac.org/house#BuildingA> owl:differentFrom <https://ldac.org/house#SiteA>)\n"
]
}
],
"source": [
"// import the BOT Ontology from the source via HTTP\n",
"/****** the T-BOX *************/\n",
"Model bot = FileManager.get().loadModel(\"https://w3id.org/bot#\");\n",
"\n",
"// create on OWL reasoner and feed it the bot ontology model\n",
"Reasoner reasoner = ReasonerRegistry.getOWLReasoner();\n",
"reasoner = reasoner.bindSchema(bot);\n",
"\n",
"//create inferences from \n",
"InfModel infmodel = ModelFactory.createInfModel(reasoner, simple_house);\n",
"System.out.println (\"\\n\\n/***************** facts AFTER inference ****************/\");\n",
"// print out all statements asserted and inferred \n",
"Resource Site = infmodel.getResource(\"https://ldac.org/house#BuildingA\");\n",
"for (StmtIterator i = ((Model)infmodel).listStatements(new SimpleSelector( Site, null, (RDFNode)null )); i.hasNext();){\n",
" Statement stmt = i.nextStatement();\n",
" System.out.println (PrintUtil.print(stmt));\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extend the BOT ontology with a \"connectivity\" property\n",
"\n",
"A simple extension is loaded that consists of the following three statements:\n",
"```\n",
"@prefix bot: <https://w3id.org/bot#> .\n",
"@prefix conn: <https://ldac.org/connection#> .\n",
"@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
"@prefix owl: <http://www.w3.org/2002/07/owl#> .\n",
"\n",
"conn:isConnectedTo a owl:SymmetricProperty;\n",
" a owl:TransitiveProperty;\n",
" rdfs:range bot:Zone.\n",
"```\n",
"\n",
"The `owl:SymmetricProperty` means that \n",
"- if A is connected to B \n",
"- then it follows that B is connected to A\n",
"\n",
"The `owl:TransitiveProperty` means that\n",
"- if A is connected to B\n",
"- and B is connected to C\n",
"- then A is connected to C\n",
"\n",
"combining both also means \n",
"- C is connected to A\n",
"\n",
"In our ABox, we a few statements to that end have been added:\n",
"```\n",
":SpaceA conn:isConnectedTo :SpaceB .\n",
":SpaceB conn:isConnectedTo :SpaceC .\n",
":Storey00 conn:isConnectedTo :SpaceA .\n",
"```\n",
"\n",
"Lets take a look at `:Storey00`\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(<https://ldac.org/house#Storey00> <https://ldac.org/connection#isConnectedTo> <https://ldac.org/house#SpaceA>)\n",
"(<https://ldac.org/house#Storey00> <https://w3id.org/bot#hasSpace> <https://ldac.org/house#SpaceB>)\n",
"(<https://ldac.org/house#Storey00> <https://w3id.org/bot#hasSpace> <https://ldac.org/house#SpaceA>)\n",
"(<https://ldac.org/house#Storey00> rdf:type <https://w3id.org/bot#Storey>)\n",
"(<https://ldac.org/house#Storey00> rdf:type owl:Thing)\n",
"(<https://ldac.org/house#Storey00> <https://w3id.org/bot#containsZone> <https://ldac.org/house#SpaceB>)\n",
"(<https://ldac.org/house#Storey00> <https://w3id.org/bot#containsZone> <https://ldac.org/house#SpaceA>)\n",
"(<https://ldac.org/house#Storey00> rdf:type <https://w3id.org/bot#Zone>)\n",
"(<https://ldac.org/house#Storey00> <https://ldac.org/connection#isConnectedTo> <https://ldac.org/house#SpaceB>)\n",
"(<https://ldac.org/house#Storey00> <https://ldac.org/connection#isConnectedTo> <https://ldac.org/house#SpaceC>)\n",
"(<https://ldac.org/house#Storey00> <https://ldac.org/connection#isConnectedTo> <https://ldac.org/house#Storey00>)\n",
"(<https://ldac.org/house#Storey00> rdf:type rdfs:Resource)\n",
"(<https://ldac.org/house#Storey00> owl:sameAs <https://ldac.org/house#Storey00>)\n",
"(<https://ldac.org/house#Storey00> owl:differentFrom <https://ldac.org/house#SiteA>)\n",
"(<https://ldac.org/house#Storey00> owl:differentFrom <https://ldac.org/house#BuildingA>)\n",
"(<https://ldac.org/house#Storey00> owl:differentFrom <https://ldac.org/house#SpaceD>)\n",
"(<https://ldac.org/house#Storey00> owl:differentFrom <https://ldac.org/house#SpaceC>)\n",
"(<https://ldac.org/house#Storey00> owl:differentFrom <https://ldac.org/house#SpaceB>)\n",
"(<https://ldac.org/house#Storey00> owl:differentFrom <https://ldac.org/house#SpaceA>)\n"
]
}
],
"source": [
"Model conn = FileManager.get().loadModel(\"../data/conn.ttl\");\n",
"bot.add(conn);\n",
"\n",
"Reasoner reasoner = ReasonerRegistry.getOWLReasoner();\n",
"reasoner = reasoner.bindSchema(bot);\n",
"\n",
"//create inferences from \n",
"InfModel infmodel = ModelFactory.createInfModel(reasoner, simple_house);\n",
"\n",
"//simple_house.write(System.out,\"RDF/XML\");\n",
"Resource Site = infmodel.getResource(\"https://ldac.org/house#Storey00\");\n",
"for (StmtIterator i = ((Model)infmodel).listStatements(new SimpleSelector( Site, null, (RDFNode)null )); i.hasNext();){\n",
" Statement stmt = i.nextStatement();\n",
" System.out.println (PrintUtil.print(stmt));\n",
"}"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Java",
"language": "java",
"name": "java"
},
"language_info": {
"codemirror_mode": "java",
"file_extension": ".jshell",
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
"version": "12.0.1+12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Loading