From e431e276a66f1c479610c3c1e12a52a6b6c35432 Mon Sep 17 00:00:00 2001 From: Barry Nouwt Date: Fri, 31 Oct 2025 12:04:11 +0100 Subject: [PATCH 1/3] Update cache duration to reduce cache size. --- .../java/eu/knowledge/engine/smartconnector/impl/Util.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/Util.java b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/Util.java index ee214c274..79a86b4fc 100644 --- a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/Util.java +++ b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/Util.java @@ -10,7 +10,7 @@ import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.configuration.MutableConfiguration; -import javax.cache.expiry.CreatedExpiryPolicy; +import javax.cache.expiry.AccessedExpiryPolicy; import javax.cache.expiry.Duration; import javax.cache.spi.CachingProvider; @@ -40,7 +40,7 @@ public class Util { CacheManager cacheManager = cachingProvider.getCacheManager(); MutableConfiguration config = new MutableConfiguration() .setTypes(String.class, Node.class).setStoreByValue(false) - .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_HOUR)); + .setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(Duration.TEN_MINUTES)); nodeCache = cacheManager.createCache("nodeCache", config); } @@ -100,7 +100,7 @@ public static Model generateModel(GraphPattern graphPattern, BindingSet variable } return m; } - + public static Set translateGraphPatternTo(GraphPattern pattern) { TriplePattern tp; From 98c23682aabf21fc9677e3195770d69001f676c9 Mon Sep 17 00:00:00 2001 From: Barry Nouwt Date: Fri, 31 Oct 2025 15:15:20 +0100 Subject: [PATCH 2/3] Make sure we close generated resources after usage. --- .../eu/knowledge/engine/admin/MetadataKB.java | 32 ++++++++++--------- .../impl/MetaKnowledgeBaseImpl.java | 2 ++ .../util/KnowledgeBaseImpl.java | 1 + 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java b/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java index 5937bc951..f8906abea 100644 --- a/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java +++ b/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java @@ -6,6 +6,7 @@ import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.Resource; +import org.apache.jena.rdf.model.ResourceFactory; import org.apache.jena.shared.PrefixMapping; import org.apache.jena.sparql.graph.PrefixMappingMem; import org.apache.jena.sparql.lang.arq.javacc.ParseException; @@ -125,6 +126,7 @@ public BindingSet handleNewKnowledgeBase(ReactExchangeInfo ei) { Resource kb = model.listSubjectsWithProperty(RDF.type, Vocab.KNOWLEDGE_BASE).next(); this.metadata.add(model); + model.close(); LOG.debug("Modified metadata with new KB '{}'.", kb); } catch (ParseException e) { LOG.error("{}", e); @@ -155,6 +157,8 @@ public BindingSet handleChangedKnowledgeBase(ReactExchangeInfo ei) { this.metadata.add(model); + model.close(); + LOG.debug("Modified metadata with changed KB '{}'.", kb); } catch (ParseException e) { @@ -167,26 +171,20 @@ public BindingSet handleRemovedKnowledgeBase(ReactExchangeInfo ei) { if (!this.canReceiveUpdates()) return new BindingSet(); - try { - Model model = eu.knowledge.engine.smartconnector.impl.Util.generateModel(this.aKI.getPattern(), - ei.getArgumentBindings()); + // this is also a little complex... we have to: + // - extract the knowledge base that this message is about + // - delete all old data about that knowledge base - // this is also a little complex... we have to: - // - extract the knowledge base that this message is about - // - delete all old data about that knowledge base + Resource kb = this.metadata.createResource(ei.getArgumentBindings().iterator().next().get("kb")); - Resource kb = model.listSubjectsWithProperty(RDF.type, Vocab.KNOWLEDGE_BASE).next(); - String query = String.format("DELETE { %s } WHERE { %s FILTER (?kb = <%s>) } ", - this.metaGraphPattern.getPattern(), this.metaGraphPattern.getPattern(), kb.toString()); + String query = String.format("DELETE { %s } WHERE { %s FILTER (?kb = <%s>) } ", + this.metaGraphPattern.getPattern(), this.metaGraphPattern.getPattern(), kb.toString()); - UpdateRequest updateRequest = UpdateFactory.create(query); - UpdateAction.execute(updateRequest, this.metadata); + UpdateRequest updateRequest = UpdateFactory.create(query); + UpdateAction.execute(updateRequest, this.metadata); - LOG.debug("Modified metadata with deleted KB '{}'.", kb); + LOG.debug("Modified metadata with deleted KB '{}'.", kb); - } catch (ParseException e) { - LOG.error("{}", e); - } return new BindingSet(); } @@ -198,6 +196,10 @@ public void fetchInitialData() { // execute actual *ask* and use previously defined Knowledge Interaction. this.getSC().ask(this.aKI, new BindingSet()).thenAccept(askResult -> { try { + + if (this.metadata != null) + this.metadata.close(); + // using the BindingSet#generateModel() helper method, we can combine the graph // pattern and the bindings for its variables into a valid RDF Model. this.metadata = eu.knowledge.engine.smartconnector.impl.Util.generateModel(this.aKI.getPattern(), diff --git a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/MetaKnowledgeBaseImpl.java b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/MetaKnowledgeBaseImpl.java index 8ee436d3a..a34e878da 100644 --- a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/MetaKnowledgeBaseImpl.java +++ b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/MetaKnowledgeBaseImpl.java @@ -527,6 +527,8 @@ private OtherKnowledgeBase constructOtherKnowledgeBaseFromBindingSet(BindingSet } + model.close(); + URI kbId = null; try { kbId = new URI(kb.getURI()); diff --git a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/util/KnowledgeBaseImpl.java b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/util/KnowledgeBaseImpl.java index c6bd02293..3082af347 100644 --- a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/util/KnowledgeBaseImpl.java +++ b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/util/KnowledgeBaseImpl.java @@ -303,6 +303,7 @@ public boolean isUpToDate(AskKnowledgeInteraction askKnowledgeInteraction, isUpToDate &= isKnowledgeBaseUpToDate(aKnowledgeBase, m); } } + m.close(); } catch (InterruptedException | ExecutionException | ParseException e) { LOG.error("{}", e); From d97e331d1d247cdf16089afffc7405d95918e7ea Mon Sep 17 00:00:00 2001 From: Barry Nouwt Date: Fri, 31 Oct 2025 15:41:59 +0100 Subject: [PATCH 3/3] Fix small error in KB ID retrieval. --- .../src/main/java/eu/knowledge/engine/admin/MetadataKB.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java b/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java index f8906abea..0a9421bfd 100644 --- a/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java +++ b/admin-ui/src/main/java/eu/knowledge/engine/admin/MetadataKB.java @@ -175,7 +175,10 @@ public BindingSet handleRemovedKnowledgeBase(ReactExchangeInfo ei) { // - extract the knowledge base that this message is about // - delete all old data about that knowledge base - Resource kb = this.metadata.createResource(ei.getArgumentBindings().iterator().next().get("kb")); + String kbUri = ei.getArgumentBindings().iterator().next().get("kb"); + Resource kb = this.metadata.createResource(kbUri.substring(1, kbUri.length() - 1)); + + LOG.info("KB '{}'.", kb); String query = String.format("DELETE { %s } WHERE { %s FILTER (?kb = <%s>) } ", this.metaGraphPattern.getPattern(), this.metaGraphPattern.getPattern(), kb.toString());