diff --git a/examples/java-api/.gitignore b/examples/java-api/.gitignore
deleted file mode 100644
index 279783867..000000000
--- a/examples/java-api/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-target
-/.classpath
-/.project
-/.settings/
diff --git a/examples/java-api/pom.xml b/examples/java-api/pom.xml
deleted file mode 100644
index 125c0f9b6..000000000
--- a/examples/java-api/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
- 4.0.0
- examples
- jar
- Knowledge Engine - Java API Example
-
- eu.knowledge.engine
- ke-parent
- ${revision}
- ../..
-
-
- A Knowledge Base that shares power measurements of an EEBUS
- submeter.
-
-
-
- eu.knowledge.engine
- smart-connector
- ${project.version}
-
-
-
-
- org.apache.jena
- apache-jena-libs
- pom
-
-
-
- org.eclipse.paho
- org.eclipse.paho.mqttv5.client
- 1.2.5
-
-
-
- org.json
- json
- 20251224
-
-
-
-
- org.slf4j
- slf4j-simple
-
-
-
-
- org.junit.jupiter
- junit-jupiter-api
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- test
-
-
-
diff --git a/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/KEODemo.java b/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/KEODemo.java
deleted file mode 100644
index bd52ca04a..000000000
--- a/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/KEODemo.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.knowledge.engine.examples.keo;
-
-import java.net.URISyntaxException;
-
-import org.eclipse.paho.mqttv5.common.MqttException;
-
-import eu.knowledge.engine.smartconnector.api.KnowledgeBase;
-
-public class KEODemo {
- public static void main(String[] args) throws MqttException, URISyntaxException {
- KnowledgeBase powerGateway = new PowerGateway("tcp://127.0.0.1:1883");
- KnowledgeBase powerUI = new PowerUI();
-
- // Next steps:
- // 1. Sending action (power limit) to device instead of reading events from device (communicative act validation)
- // 2. Send other simple messages such as frequency.
- // 3. More complex messages (lists, phases)
- // 4. Auto generate graph pattern from thing description
- }
-}
diff --git a/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/PowerGateway.java b/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/PowerGateway.java
deleted file mode 100644
index 4c103d93e..000000000
--- a/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/PowerGateway.java
+++ /dev/null
@@ -1,262 +0,0 @@
-package eu.knowledge.engine.examples.keo;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.UUID;
-
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.graph.PrefixMappingMem;
-import org.apache.jena.sparql.sse.SSE;
-import org.eclipse.paho.mqttv5.client.IMqttToken;
-import org.eclipse.paho.mqttv5.client.MqttAsyncClient;
-import org.eclipse.paho.mqttv5.client.MqttCallback;
-import org.eclipse.paho.mqttv5.client.MqttConnectionOptions;
-import org.eclipse.paho.mqttv5.client.MqttDisconnectResponse;
-import org.eclipse.paho.mqttv5.common.MqttException;
-import org.eclipse.paho.mqttv5.common.MqttMessage;
-import org.eclipse.paho.mqttv5.common.packet.MqttProperties;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import eu.knowledge.engine.smartconnector.api.Binding;
-import eu.knowledge.engine.smartconnector.api.BindingSet;
-import eu.knowledge.engine.smartconnector.api.CommunicativeAct;
-import eu.knowledge.engine.smartconnector.api.GraphPattern;
-import eu.knowledge.engine.smartconnector.api.KnowledgeBase;
-import eu.knowledge.engine.smartconnector.api.PostKnowledgeInteraction;
-import eu.knowledge.engine.smartconnector.api.ReactKnowledgeInteraction;
-import eu.knowledge.engine.smartconnector.api.SmartConnector;
-import eu.knowledge.engine.smartconnector.api.Vocab;
-import eu.knowledge.engine.smartconnector.impl.SmartConnectorBuilder;
-
-public class PowerGateway implements MqttCallback, KnowledgeBase {
- private static final Logger LOG = LoggerFactory.getLogger(PowerGateway.class);
-
- private MqttConnectionOptions mqttConnectionOptions;
- private MqttAsyncClient mqttClient;
-
- private final URI knowledgeBaseId;
- private final SmartConnector sc;
-
- private PostKnowledgeInteraction pkiPower;
- private ReactKnowledgeInteraction rkiPowerLimit;
-
- private PrefixMappingMem prefixes;
-
- private static final String SUB_TOPIC = "keo/json_api/from_eebus";
- private static final String PUB_TOPIC = "keo/json_api/to_eebus";
-
- private static final String EX_DATA = "https://www.interconnectproject.eu/knowledge-engine/data/example/keo/";
-
- public PowerGateway(String mqttURI) throws MqttException, URISyntaxException {
- this.setupMQTT(mqttURI);
- this.connectMQTT();
- this.subscribe(SUB_TOPIC);
-
- this.prefixes = new PrefixMappingMem();
- this.prefixes.setNsPrefixes(PrefixMapping.Standard);
- this.prefixes.setNsPrefix("kb", Vocab.ONTO_URI);
- this.prefixes.setNsPrefix("om", "http://www.ontology-of-units-of-measure.org/resource/om-2/");
- this.prefixes.setNsPrefix("sosa", "http://www.w3.org/ns/sosa/");
- this.prefixes.setNsPrefix("saref", "https://saref.etsi.org/core/");
- this.prefixes.setNsPrefix("interconnect", "http://ontology.tno.nl/Interconnect#");
- this.prefixes.setNsPrefix("ex-data", EX_DATA);
-
- this.knowledgeBaseId = new URI(
- "https://www.interconnectproject.eu/knowledge-engine/knowledgebase/example/power-gateway");
-
- this.sc = SmartConnectorBuilder.newSmartConnector(this).create();
- }
-
- private void setupMQTT(String mqttURI) throws MqttException {
- // Issue client ID based on thread id.
- String clientID = "mqtt-client-" + Thread.currentThread().getId();
-
- LOG.info("Setting up MQTT client with id '{}'.", clientID);
-
- this.mqttClient = new MqttAsyncClient(mqttURI, clientID, null);
- this.mqttClient.setCallback(this);
-
- this.mqttConnectionOptions = new MqttConnectionOptions();
- this.mqttConnectionOptions.setServerURIs(new String[] { mqttURI });
- }
-
- private void connectMQTT() throws MqttException {
- LOG.info("Connecting to MQTT at {}", this.mqttConnectionOptions.getServerURIs()[0]);
- IMqttToken connectToken = this.mqttClient.connect(this.mqttConnectionOptions);
- connectToken.waitForCompletion(500);
- }
-
- private void subscribe(String topic) throws MqttException {
- LOG.info("Subscribing to topic '{}'.", topic);
- IMqttToken subToken = this.mqttClient.subscribe(topic, 0);
- subToken.waitForCompletion(500);
- }
-
- @Override
- public void authPacketArrived(int reasonCode, MqttProperties properties) {
- LOG.info("AUTH PACKET ARRIVED");
- }
-
- @Override
- public void connectComplete(boolean reconnect, String serverURI) {
- LOG.info("CONNECTED");
- }
-
- @Override
- public void deliveryComplete(IMqttToken token) {
- LOG.info("DELIVERED");
- }
-
- @Override
- public void disconnected(MqttDisconnectResponse disconnectResponse) {
- LOG.warn("DISCONNECTED");
- }
-
- @Override
- public void messageArrived(String topic, MqttMessage message) throws Exception {
- LOG.info("MESSAGE ARRIVED in topic {}: {}", topic, message);
-
- var jsonObj = new JSONObject(message.toString());
-
- if (!jsonObj.getString("type").equals("de.keo-connectivity.generic.mpc.powerTotal")) {
- LOG.info("Ignoring message type '{}'", jsonObj.getString("type"));
- return;
- }
-
- String msgId = jsonObj.getString("id");
-
- int number = jsonObj.getJSONObject("data").getJSONObject("power").getInt("number");
- int scale = jsonObj.getJSONObject("data").getJSONObject("power").getInt("scale");
- String actorId = jsonObj.getJSONObject("data").getString("actorId");
- double value = number * Math.pow(10, scale);
-
- var bindings = new BindingSet();
- var binding = new Binding();
-
- binding.put("sensor", "<" + EX_DATA + "actor-" + actorId + ">");
- binding.put("observation", "<" + EX_DATA + "observation-" + msgId + ">");
- binding.put("result", "<" + EX_DATA + "result-" + msgId + ">");
- binding.put("value", "\"" + Double.toString(value) + "\"^^");
- // We record the current time. This is not necessarily the time of the
- // observation.
- binding.put("time", "\"" + ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)
- + "\"^^");
-
- bindings.add(binding);
-
- LOG.info("Posting binding: {}", binding);
-
- this.sc.post(this.pkiPower, bindings);
- }
-
- @Override
- public void mqttErrorOccurred(MqttException exception) {
- LOG.error("MQTT ERROR", exception);
- }
-
- @Override
- public URI getKnowledgeBaseId() {
- return this.knowledgeBaseId;
- }
-
- @Override
- public String getKnowledgeBaseName() {
- return "InterConnect KEO demo knowledge base";
- }
-
- @Override
- public String getKnowledgeBaseDescription() {
- return "A knowledge base that publishes power measurements.";
- }
-
- @Override
- public void smartConnectorReady(SmartConnector aSC) {
- LOG.info("Smart connector ready.");
- this.pkiPower = new PostKnowledgeInteraction(
- new CommunicativeAct(),
- new GraphPattern(this.prefixes,
- "?observation rdf:type sosa:Observation .",
- "?observation sosa:madeBySensor ?sensor .",
- "?observation sosa:observedProperty saref:Power .",
- "?observation sosa:hasResult ?result .",
- "?observation sosa:resultTime ?time .",
- "?result om:hasNumericalValue ?value .",
- "?result om:hasUnit om:watt ."
- ),
- null
- );
- this.sc.register(this.pkiPower);
-
- // The following KI listens for actuation commands.
- this.rkiPowerLimit = new ReactKnowledgeInteraction(
- new CommunicativeAct(new HashSet<>(Arrays.asList(Vocab.PURPOSE)), new HashSet<>(Arrays.asList(Vocab.ACTUATION_PURPOSE))),
- new GraphPattern(this.prefixes,
- "?limit om:hasUnit om:watt .",
- "?command rdf:type saref:SetLevelCommand .",
- "?command saref:actsUpon saref:PowerLimit .",
- "?limit om:hasNumericalValue ?limitValue .",
- "?command interconnect:SetsValue ?limit ."
- ),
- null
- );
-
- // When receiving an actuation command, send it to EEBUS via the queue
- this.sc.register(this.rkiPowerLimit, (rki, aReactExchangeInfo) -> {
- var argument = aReactExchangeInfo.getArgumentBindings();
- try {
- var b = argument.iterator().next();
- var limit = (Float) SSE.parseNode(b.get("limitValue")).getLiteralValue();
- LOG.info("Setting limit at {}", limit);
- this.sendPowerLimitMessage(Math.round(limit * 100), -2, 5);
- } catch (MqttException e) {
- LOG.error("Could not send message to MQTT.", e);
- }
- return new BindingSet();
- });
- }
-
- @Override
- public void smartConnectorConnectionLost(SmartConnector aSC) {
- LOG.warn("Connection lost with smart connector.");
- }
-
- @Override
- public void smartConnectorConnectionRestored(SmartConnector aSC) {
- LOG.info("Connection with smart connector restored.");
- }
-
- @Override
- public void smartConnectorStopped(SmartConnector aSC) {
- LOG.info("Smart connector stopped.");
- }
-
- private void sendPowerLimitMessage(int number, int scale, int ttl) throws MqttException {
- // Send a message back saying we want to limit the power.
- var msg = new JSONObject();
- msg.put("type", "de.keo-connectivity.generic.lpc.powerLimit");
- msg.put("source", "PowerGateway Knowledge Base");
- msg.put("id", UUID.randomUUID().toString());
- msg.put("specversion", "1.0");
- var data = new JSONObject();
- data.put("actorId", "d:_n:KEO_json_grid_server/1/");
- var limit = new JSONObject();
- var limitValue = new JSONObject();
- limitValue.put("number", number);
- limitValue.put("scale", scale);
- limit.put("value", limitValue);
- limit.put("active", true);
- limit.put("ttl", ttl);
- data.put("limit", limit);
- msg.put("data", data);
-
- this.mqttClient.publish(PUB_TOPIC, msg.toString().getBytes(StandardCharsets.UTF_8), 0, false);
- }
-}
diff --git a/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/PowerUI.java b/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/PowerUI.java
deleted file mode 100644
index 7bad18218..000000000
--- a/examples/java-api/src/main/java/eu/knowledge/engine/examples/keo/PowerUI.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package eu.knowledge.engine.examples.keo;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.HashSet;
-
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.graph.PrefixMappingMem;
-import org.apache.jena.sparql.sse.SSE;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import eu.knowledge.engine.smartconnector.api.Binding;
-import eu.knowledge.engine.smartconnector.api.BindingSet;
-import eu.knowledge.engine.smartconnector.api.CommunicativeAct;
-import eu.knowledge.engine.smartconnector.api.GraphPattern;
-import eu.knowledge.engine.smartconnector.api.KnowledgeBase;
-import eu.knowledge.engine.smartconnector.api.PostKnowledgeInteraction;
-import eu.knowledge.engine.smartconnector.api.ReactKnowledgeInteraction;
-import eu.knowledge.engine.smartconnector.api.SmartConnector;
-import eu.knowledge.engine.smartconnector.api.Vocab;
-import eu.knowledge.engine.smartconnector.impl.SmartConnectorBuilder;
-
-public class PowerUI implements KnowledgeBase {
- private static final Logger LOG = LoggerFactory.getLogger(PowerUI.class);
-
- private PrefixMappingMem prefixes;
- private URI knowledgeBaseId;
-
- private ReactKnowledgeInteraction rkiPower;
- private PostKnowledgeInteraction pkiPowerLimit;
-
- private SmartConnector sc;
-
- private static final String EX_DATA = "https://www.interconnectproject.eu/knowledge-engine/data/example/keo/";
-
- public PowerUI() throws URISyntaxException {
- this.prefixes = new PrefixMappingMem();
- this.prefixes.setNsPrefixes(PrefixMapping.Standard);
- this.prefixes.setNsPrefix("kb", Vocab.ONTO_URI);
- this.prefixes.setNsPrefix("om", "http://www.ontology-of-units-of-measure.org/resource/om-2/");
- this.prefixes.setNsPrefix("sosa", "http://www.w3.org/ns/sosa/");
- this.prefixes.setNsPrefix("saref", "https://saref.etsi.org/core/");
- this.prefixes.setNsPrefix("interconnect", "http://ontology.tno.nl/Interconnect#");
- this.prefixes.setNsPrefix("ex-data", EX_DATA);
-
- this.knowledgeBaseId = new URI(
- "https://www.interconnectproject.eu/knowledge-engine/knowledgebase/example/power-ui");
-
- this.sc = SmartConnectorBuilder.newSmartConnector(this).create();
- }
-
- @Override
- public URI getKnowledgeBaseId() {
- return this.knowledgeBaseId;
- }
-
- @Override
- public String getKnowledgeBaseName() {
- return "Epic Power Visualization Knowledge Base";
- }
-
- @Override
- public String getKnowledgeBaseDescription() {
- return "This knowledge base visualizes power measurements in an epic manner.";
- }
-
- @Override
- public void smartConnectorReady(SmartConnector aSC) {
- LOG.info("Smart connector ready.");
-
- // This KI listens for power measurements published on the network.
- this.rkiPower = new ReactKnowledgeInteraction(new CommunicativeAct(),
- new GraphPattern(this.prefixes, "?observation rdf:type sosa:Observation .",
- "?observation sosa:madeBySensor ?sensor .", "?observation sosa:observedProperty saref:Power .",
- "?observation sosa:hasResult ?result .", "?observation sosa:resultTime ?time .",
- "?result om:hasNumericalValue ?value .", "?result om:hasUnit om:watt ."),
- null
- );
-
- // When receiving such a power measurement, do some business logic and post
- // a power limit to the network.
- this.sc.register(this.rkiPower, (rki, aReactExchangeInfo) -> {
- var bindings = aReactExchangeInfo.getArgumentBindings();
- var binding = bindings.iterator().next();
- var value = binding.get("value");
-
- var n = (Float) SSE.parseNode(value).getLiteralValue();
- LOG.info("The power was {} at {}", n, binding.get("time"));
-
- BindingSet newBindings = new BindingSet();
- Binding powerLimitBinding = new Binding();
-
- // TODO: These should be unique.
- powerLimitBinding.put("limit", "");
- powerLimitBinding.put("command", "");
-
- if (n > 500) {
- powerLimitBinding.put("limitValue", "\"500\"^^");
- } else {
- powerLimitBinding.put("limitValue", "\"100\"^^");
- }
- newBindings.add(powerLimitBinding);
-
- this.sc.post(this.pkiPowerLimit, newBindings);
-
- return new BindingSet();
- });
-
- // This KI allows to post power limit commands (actuations).
- this.pkiPowerLimit = new PostKnowledgeInteraction(
- new CommunicativeAct(new HashSet<>(Arrays.asList(Vocab.ACTUATION_PURPOSE)), new HashSet<>(Arrays.asList(Vocab.PURPOSE))),
- new GraphPattern(this.prefixes,
- "?limit om:hasUnit om:watt .",
- "?command rdf:type saref:SetLevelCommand .",
- "?command saref:actsUpon saref:PowerLimit .",
- "?limit om:hasNumericalValue ?limitValue .",
- "?command interconnect:SetsValue ?limit ."
- ),
- null
- );
- this.sc.register(this.pkiPowerLimit);
- }
-
- @Override
- public void smartConnectorConnectionLost(SmartConnector aSC) {
- LOG.warn("Connection lost with smart connector.");
- }
-
- @Override
- public void smartConnectorConnectionRestored(SmartConnector aSC) {
- LOG.info("Connection with smart connector restored.");
- }
-
- @Override
- public void smartConnectorStopped(SmartConnector aSC) {
- LOG.info("Smart connector stopped.");
- }
-}
diff --git a/pom.xml b/pom.xml
index 9d603f1d0..7a39f62ca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,6 @@
smart-connector
admin-ui
- examples/java-api
knowledge-directory
smart-connector-rest-server
smart-connector-api