From e66a4e1a86412ec52486c00f2f42a3928aa43ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Tue, 4 Jun 2024 22:27:45 +0200 Subject: [PATCH] GH-5016 introduce cache for common vocabulary in LMDB Store --- .../eclipse/rdf4j/sail/lmdb/ValueStore.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/ValueStore.java b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/ValueStore.java index d445e81210..ad5d93dad1 100644 --- a/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/ValueStore.java +++ b/core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/ValueStore.java @@ -56,6 +56,7 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.StampedLock; @@ -845,6 +846,8 @@ public long getId(Value value) throws IOException { return getId(value, false); } + private final ConcurrentHashMap commonVocabulary = new ConcurrentHashMap<>(); + /** * Gets the ID for the specified value. * @@ -872,6 +875,9 @@ public long getId(Value value, boolean create) throws IOException { try { // Check cache Long cachedID = valueIDCache.get(value); + if (cachedID == null) { + cachedID = commonVocabulary.get(value); + } if (cachedID != null) { long id = cachedID; @@ -903,6 +909,11 @@ public long getId(Value value, boolean create) throws IOException { // Store id in cache LmdbValue nv = getLmdbValue(value); nv.setInternalID(id, revision); + + if (nv.isIRI() && isCommonVocabulary(((IRI) nv))) { + commonVocabulary.put(value, id); + } + valueIDCache.put(nv, id); } } @@ -916,6 +927,14 @@ public long getId(Value value, boolean create) throws IOException { return LmdbValue.UNKNOWN_ID; } + private static boolean isCommonVocabulary(IRI nv) { + String string = nv.toString(); + return string.startsWith("http://www.w3.org/") || + string.startsWith("http://purl.org/") || + string.startsWith("http://publications.europa.eu/resource/authority") || + string.startsWith("http://xmlns.com/"); + } + public void gcIds(Collection ids, Collection nextIds) throws IOException { if (!ids.isEmpty()) { // wrap into read txn as resizeMap expects an active surrounding read txn