Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inefficient Knowledge Base SPARQL query for labels #4570

Closed
tpluscode opened this issue Feb 28, 2024 · 26 comments
Closed

Inefficient Knowledge Base SPARQL query for labels #4570

tpluscode opened this issue Feb 28, 2024 · 26 comments
Assignees
Labels
🐛Bug Something isn't working Module: Knowledge Base 🗑️ Wontfix This will not be worked on

Comments

@tpluscode
Copy link

tpluscode commented Feb 28, 2024

Describe the bug

I found that the patterns used in the KB query to retrieve instances is suboptimal, and in the case of AllegroGraph, it somehow makes it completely fail when reasoning is enabled on the SPARQL endpoint

To Reproduce

Steps to reproduce the behavior:

  1. Set up a SPARQL KB with endpoint https://query.wikibus.org/query (IRI schema RDF)
  2. Set up a layer property to use that KB (for example instances-only)
  3. Try finding an instance in annotated (type "Yutong")

Expected behavior

Some data should be returned but AllegroGraph will time-out.

Screenshots

No response

Environment

31.1 (2024-02-20 23:27:52, build c78ce3c5)

Additional context

I found that the query works when I disable reasoning and consistently takes about 2.5-3 seconds (reasoning has no effect on the result of that query)

I found the query in question in the logs, having these patterns

{ 
  OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> * <http://www.w3.org/2000/01/rdf-schema#label> . }
  { 
    ?subj ?pMatch ?m .
    FILTER ( ( REGEX( ?m, "^Yutong", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) 
  } 
}

I don't know what the deal with AllegroGraph is (I filed a ticket there too), but the OPTIONAL graph pattern is to blame. I find it unnecessary. I also don't see why it should be outside the next BGP containing the pattern ?subj ?pMatch ?m .

Instead, I'd move it inside and remove OPTIONAL to make it much faster. With reasoning enabled, it returns in about 0.5 seconds once caches are filled. Without reasoning it goes down to about 200 ms.

Here's my rendition of that query: https://s.zazuko.com/2gQvGBw

@tpluscode tpluscode added Triage 🐛Bug Something isn't working labels Feb 28, 2024
@reckart
Copy link
Member

reckart commented Feb 29, 2024

For larger KBs, the queries INCEpTION uses are not unlikely to time out. Usually, it boils down INCEpTION not having support for the respective full text indexing capabilities of the endpoint. The AllegroGraph FTI is e.g. not supported by INCEpTION at the moment.

Also, INCEpTION assumes that knowledge bases do not have reasoning enabled and therefore has somewhat more complex queries that e.g. look up subtypes of labels at query time.

@tpluscode
Copy link
Author

tpluscode commented Feb 29, 2024

FWIW, this KB is not big; my issue likely a DB problem, but that particular OPTIONAL IMO unnecessary. Left joins often have a significant performance impact and removing it here should have positive effect for every case.

Later today, I can also compare on Stardog which I use at work

@reckart
Copy link
Member

reckart commented Feb 29, 2024

If I would remove it, I would have trouble with KBs that make use of subproperties and either do not have a reasoner enabled or do not contain the fully resolved subPropertyOf statements with each subject.

@reckart
Copy link
Member

reckart commented Feb 29, 2024

It might be considered to make the clause non-optional - that would mean that concepts without a label cannot be retrieved at all. I believe retrieving concepts without a label is something we hardly do these days...

@tpluscode
Copy link
Author

tpluscode commented Feb 29, 2024

Not remove the whole graph pattern, just the OPTIONAL keyword, leaving the property path to find labels unchanged.

@tpluscode
Copy link
Author

Ah, I see you replied while I was typing. Alternatively, UNION can have better performance than optionals but since the query is filtered by matching labels, would it return anything if there were no labels? You probably use a similar, unfiltered query to retrieve the list of in the KB screen, right?

@reckart
Copy link
Member

reckart commented Feb 29, 2024

Fortunately, the SPARQL part of INCEpTION has a pretty comprehensive test suite. Removing the optional does not cause any of the tests to fail. So if it helps, let's do that :)

@reckart
Copy link
Member

reckart commented Feb 29, 2024

You probably use a similar, unfiltered query to retrieve the list of in the KB screen, right?

The queries are generated using INCEpTION's SPARQLQueryBuilder which supports various options and variations. It's not like every query is hand written. The OPTIONAL here is part of the code that retrieves the label. Similar (but not the same) code is used for querying parent/child/ancestor/descendent axes.

@reckart reckart self-assigned this Feb 29, 2024
@reckart reckart added this to the 31.2 milestone Feb 29, 2024
reckart added a commit that referenced this issue Feb 29, 2024
- Remove "optional" to speed up query on AllegroGraph backends
@reckart
Copy link
Member

reckart commented Feb 29, 2024

Without the optional, querying wikibus is still a bit sluggish. I'd expect that situation would improve by supporting the AllegroGraph FTI.

@reckart
Copy link
Member

reckart commented Feb 29, 2024

About moving the pMatch clause into the braces - I need to check how much refactoring of the SPARQLQueryBuilder that would entail.

@tpluscode
Copy link
Author

About moving the pMatch clause into the braces - I need to check how much refactoring of the SPARQLQueryBuilder that would entail.

I think you should ignore that suggestion. I probably doesn't matter if the pattern is inside or outside.

Without the optional, querying wikibus is still a bit sluggish. I'd expect that situation would improve by supporting the AllegroGraph FTI.

Do you also get response times around 0.5 s?

@tpluscode
Copy link
Author

I will have to beef up that server at some point, probably :)

reckart added a commit that referenced this issue Feb 29, 2024
…nt-Knowledge-Base-SPARQL-query-for-labels

#4570 - Inefficient Knowledge Base SPARQL query for labels
@reckart reckart closed this as completed Feb 29, 2024
reckart added a commit that referenced this issue Feb 29, 2024
* release/31.x:
  #4570 - Inefficient Knowledge Base SPARQL query for labels
reckart added a commit that referenced this issue Feb 29, 2024
…ty-annotation

* main:
  #4570 - Inefficient Knowledge Base SPARQL query for labels
  No issue: Small improvement to log message.
  #4565 - Improve system-level backup documentation
  #4558 - Better verification for feature names
  #4558 - Better verification for feature names
  #4558 - Better verification for feature names
@reckart
Copy link
Member

reckart commented Mar 1, 2024

I get response times much longer than 0.5s - look for Query returned below.

2024-03-01 18:03:37 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - [c7e1db54] Query: SELECT DISTINCT ?m ?dc ?dp ?subj
WHERE { { { OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> * <http://www.w3.org/2000/01/rdf-schema#label> . }
VALUES ( ?m ) { ("Yutong"@en) ("Yutong") } 
?subj ?pMatch ?m . } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

2024-03-01 18:03:38 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - Input: [KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong]]
2024-03-01 18:03:38 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - Output: [KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong]]
2024-03-01 18:03:38 DEBUG [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - [c7e1db54] Query returned 1 results in 99ms 
2024-03-01 18:03:38 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - [26e76b98] Query: SELECT DISTINCT ?m ?dc ?dp ?subj
WHERE { { {} }
{ OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> * <http://www.w3.org/2000/01/rdf-schema#label> . }
{ ?subj ?pMatch ?m .
FILTER ( ( REGEX( STR( ?m ), "^Yutong", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

2024-03-01 18:03:39 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - Input: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 18:03:39 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - Output: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 18:03:39 DEBUG [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - [26e76b98] Query returned 22 results in 1295ms -- SLOW QUERY!
2024-03-01 18:03:39 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - [8a47d62a] Query: SELECT DISTINCT ?m ?dc ?dp ?subj
WHERE { { {} }
{ OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> * <http://www.w3.org/2000/01/rdf-schema#label> . }
{ ?subj ?pMatch ?m .
FILTER ( ( REGEX( STR( ?m ), ".*Yutong.*", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

2024-03-01 18:03:42 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - Input: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://uz.wikipedia.org/wiki/Yutong,name=(uz) Yutong], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://fi.wikipedia.org/wiki/Yutong,name=(fi) Yutong], KBHandle[identifier=https://uk.wikipedia.org/wiki/Yutong,name=(uk) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://fr.wikipedia.org/wiki/Yutong,name=(fr) Yutong], KBHandle[identifier=https://bg.wikipedia.org/wiki/Yutong,name=(bg) Yutong], KBHandle[identifier=https://es.wikipedia.org/wiki/Yutong,name=(es) Yutong], KBHandle[identifier=https://id.wikipedia.org/wiki/Yutong,name=(id) Yutong], KBHandle[identifier=https://en.wikipedia.org/wiki/Yutong,name=(en) Yutong], KBHandle[identifier=https://commons.wikimedia.org/wiki/Category:Yutong_vehicles,name=(en) Category:Yutong vehicles], KBHandle[identifier=https://ru.wikipedia.org/wiki/Yutong,name=(ru) Yutong], KBHandle[identifier=https://de.wikipedia.org/wiki/Yutong,name=(de) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 18:03:42 TRACE [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - Output: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://uz.wikipedia.org/wiki/Yutong,name=(uz) Yutong], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://fi.wikipedia.org/wiki/Yutong,name=(fi) Yutong], KBHandle[identifier=https://uk.wikipedia.org/wiki/Yutong,name=(uk) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://fr.wikipedia.org/wiki/Yutong,name=(fr) Yutong], KBHandle[identifier=https://bg.wikipedia.org/wiki/Yutong,name=(bg) Yutong], KBHandle[identifier=https://es.wikipedia.org/wiki/Yutong,name=(es) Yutong], KBHandle[identifier=https://id.wikipedia.org/wiki/Yutong,name=(id) Yutong], KBHandle[identifier=https://en.wikipedia.org/wiki/Yutong,name=(en) Yutong], KBHandle[identifier=https://commons.wikimedia.org/wiki/Category:Yutong_vehicles,name=(en) Category:Yutong vehicles], KBHandle[identifier=https://ru.wikipedia.org/wiki/Yutong,name=(ru) Yutong], KBHandle[identifier=https://de.wikipedia.org/wiki/Yutong,name=(de) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 18:03:42 DEBUG [http-nio-8080-exec-9] [SYSTEM] SPARQLQueryBuilder - [8a47d62a] Query returned 33 results in 2694ms -- SLOW QUERY!

@reckart
Copy link
Member

reckart commented Mar 1, 2024

Ah, that still seems to have the optional... let me check again... but at least it does not time out.

@reckart reckart reopened this Mar 1, 2024
@reckart
Copy link
Member

reckart commented Mar 1, 2024

Ok, I found the proper optional in the code now - wasn't the one I thought it was earlier.

Now, removing that and running the tests, I can say that Wikidata (Blazegraph I suppose) really don't like it without the optional and I get several failing tests on Wikidata if I remove it.

E.g. this query returns:

Query   : 
          SELECT DISTINCT ?m ?subj
          WHERE { { { ?subj <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q924827> .
          FILTER EXISTS { ?subj <http://www.wikidata.org/prop/direct/P31> [] . } 
          FILTER NOT EXISTS { ?subj <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q35120> . }
          FILTER NOT EXISTS { [] <http://www.wikidata.org/prop/direct/P279> ?subj . }
          FILTER NOT EXISTS { ?subj <http://www.wikidata.org/prop/direct/P279> [] . } } }
          { OPTIONAL { ?pMatch <http://www.wikidata.org/prop/direct/P1647> * <http://www.w3.org/2000/01/rdf-schema#label> . }
          { ?subj ?pMatch ?m .
          FILTER ( ( REGEX( STR( ?m ), "^Amanda", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } } }
          LIMIT 200
Results : 1 in 110ms
          KBHandle[identifier=http://www.wikidata.org/entity/Q1412447,name=Amanda Grayson,language=en]

But this one does time out:

Query:
          SELECT DISTINCT ?m ?subj
          WHERE { { { ?subj <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q924827> .
          FILTER EXISTS { ?subj <http://www.wikidata.org/prop/direct/P31> [] . } 
          FILTER NOT EXISTS { ?subj <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q35120> . }
          FILTER NOT EXISTS { [] <http://www.wikidata.org/prop/direct/P279> ?subj . }
          FILTER NOT EXISTS { ?subj <http://www.wikidata.org/prop/direct/P279> [] . } } }
          { ?pMatch <http://www.wikidata.org/prop/direct/P1647> * <http://www.w3.org/2000/01/rdf-schema#label> .
          { ?subj ?pMatch ?m .
          FILTER ( ( REGEX( STR( ?m ), "^Amanda", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } } }
          LIMIT 200

So I don't think removing the optional is the right aproach.

@reckart
Copy link
Member

reckart commented Mar 1, 2024

@tpluscode If you control the Wikibus endpoint, could you enable freetext indices on it so we can test this query?

PREFIX fti: <http://franz.com/ns/allegrograph/2.2/textindex/>
SELECT DISTINCT ?sc ?m ?dc ?dp ?subj
WHERE { { { OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> * <http://www.w3.org/2000/01/rdf-schema#label> . }
{ ( ?subj ?m ?pMatch ) fti:match "yutong" .
FILTER ( ( REGEX( STR( ?m ), "^Yutong$", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

@reckart
Copy link
Member

reckart commented Mar 1, 2024

AllegroGraph is quite picky.... eclipse-rdf4j/rdf4j#4923

@tpluscode
Copy link
Author

but at least it does not time out.

For the time being I disabled reasoning on that endpoint to be able to work with it from INCEpTION. I just switched it back on.

could you enable freetext indices on it so we can test this query?

I added a broad index. Queries like above are now blazing fast :)

@reckart
Copy link
Member

reckart commented Mar 1, 2024

Good. I have a FTI support for AllegroGraph now in INCEpTION - let's see how that works...

@reckart
Copy link
Member

reckart commented Mar 1, 2024

Yup, that's fast now:

2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - [8873e1a] Query: PREFIX fti: <http://franz.com/ns/allegrograph/2.2/textindex/>
SELECT DISTINCT ?sc ?m ?dc ?dp ?subj
WHERE { { { OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf>* <http://www.w3.org/2000/01/rdf-schema#label> . }
{ ( ?subj ?m ?pMatch ) fti:match "yutong" .
FILTER ( ( REGEX( STR( ?m ), "^Yutong$", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - Input: [KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong]]
2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - Output: [KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong]]
2024-03-01 21:31:06 DEBUG [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - [8873e1a] Query returned 1 results in 116ms 
2024-03-01 21:31:06 DEBUG [http-nio-8080-exec-7] [SYSTEM] ConceptLinkingServiceImpl - Found [1] candidates exactly matching [Yutong] in 136ms
2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - [cf3751aa] Query: PREFIX fti: <http://franz.com/ns/allegrograph/2.2/textindex/>
SELECT DISTINCT ?sc ?m ?dc ?dp ?subj
WHERE { { { OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf>* <http://www.w3.org/2000/01/rdf-schema#label> . }
{ ( ?subj ?m ?pMatch ) fti:match "yutong*" .
FILTER ( ( REGEX( STR( ?m ), "^Yutong", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - Input: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - Output: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 21:31:06 DEBUG [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - [cf3751aa] Query returned 22 results in 106ms 
2024-03-01 21:31:06 DEBUG [http-nio-8080-exec-7] [SYSTEM] ConceptLinkingServiceImpl - Found [22] candidates starting with [Yutong] in 108ms
2024-03-01 21:31:06 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - [3ee9392c] Query: PREFIX fti: <http://franz.com/ns/allegrograph/2.2/textindex/>
SELECT DISTINCT ?sc ?m ?dc ?dp ?subj
WHERE { { { OPTIONAL { ?pMatch <http://www.w3.org/2000/01/rdf-schema#subPropertyOf>* <http://www.w3.org/2000/01/rdf-schema#label> . }
{ ( ?subj ?m ?pMatch ) fti:match "yutong" .
FILTER ( ( REGEX( STR( ?m ), ".*Yutong.*", "i" ) && ( LANGMATCHES( LANG( ?m ), "en" ) || LANG( ?m ) = "" ) ) ) } } }
OPTIONAL { { ?subj <http://www.w3.org/2000/01/rdf-schema#comment> ?dc .
FILTER ( ( LANGMATCHES( LANG( ?dc ), "en" ) || LANG( ?dc ) = "" ) ) } }
OPTIONAL { { ?subj <http://www.w3.org/2002/07/owl#deprecated> ?dp .
FILTER ( ( LANGMATCHES( LANG( ?dp ), "en" ) || LANG( ?dp ) = "" ) ) } } }
LIMIT 2000

2024-03-01 21:31:07 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - Input: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://uz.wikipedia.org/wiki/Yutong,name=(uz) Yutong], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://fi.wikipedia.org/wiki/Yutong,name=(fi) Yutong], KBHandle[identifier=https://uk.wikipedia.org/wiki/Yutong,name=(uk) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://fr.wikipedia.org/wiki/Yutong,name=(fr) Yutong], KBHandle[identifier=https://bg.wikipedia.org/wiki/Yutong,name=(bg) Yutong], KBHandle[identifier=https://es.wikipedia.org/wiki/Yutong,name=(es) Yutong], KBHandle[identifier=https://id.wikipedia.org/wiki/Yutong,name=(id) Yutong], KBHandle[identifier=https://en.wikipedia.org/wiki/Yutong,name=(en) Yutong], KBHandle[identifier=https://commons.wikimedia.org/wiki/Category:Yutong_vehicles,name=(en) Category:Yutong vehicles], KBHandle[identifier=https://ru.wikipedia.org/wiki/Yutong,name=(ru) Yutong], KBHandle[identifier=https://de.wikipedia.org/wiki/Yutong,name=(de) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 21:31:07 TRACE [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - Output: [KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ic12,name=Yutong IC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ec10,name=Yutong EC10], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tc12,name=Yutong TC12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/e12,name=Yutong E12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6180hg,name=Yutong ZK6180HG], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6608,name=Yutong ZK6608], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/tce12,name=Yutong TCe12], KBHandle[identifier=https://uz.wikipedia.org/wiki/Yutong,name=(uz) Yutong], KBHandle[identifier=https://new.wikibus.org/brand/yutong,name=Yutong], KBHandle[identifier=https://fi.wikipedia.org/wiki/Yutong,name=(fi) Yutong], KBHandle[identifier=https://uk.wikipedia.org/wiki/Yutong,name=(uk) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6130hg1,name=Yutong ZK6130HG1], KBHandle[identifier=https://fr.wikipedia.org/wiki/Yutong,name=(fr) Yutong], KBHandle[identifier=https://bg.wikipedia.org/wiki/Yutong,name=(bg) Yutong], KBHandle[identifier=https://es.wikipedia.org/wiki/Yutong,name=(es) Yutong], KBHandle[identifier=https://id.wikipedia.org/wiki/Yutong,name=(id) Yutong], KBHandle[identifier=https://en.wikipedia.org/wiki/Yutong,name=(en) Yutong], KBHandle[identifier=https://commons.wikimedia.org/wiki/Category:Yutong_vehicles,name=(en) Category:Yutong vehicles], KBHandle[identifier=https://ru.wikipedia.org/wiki/Yutong,name=(ru) Yutong], KBHandle[identifier=https://de.wikipedia.org/wiki/Yutong,name=(de) Yutong], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6100,name=Yutong ZK6100], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6128hge,name=Yutong ZK6128HGE], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/ice-12,name=Yutong ICe 12], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6119h2,name=Yutong ZK6119H2], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122hd9,name=Yutong ZK6122HD9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6107ha,name=Yutong ZK6107HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hga,name=Yutong ZK6118HGA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk5120c,name=Yutong ZK5120C], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6138h,name=Yutong ZK6138H], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6120ha,name=Yutong ZK6120HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6838ha,name=Yutong ZK6838HA], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6122h9,name=Yutong ZK6122H9], KBHandle[identifier=https://new.wikibus.org/vehicle/yutong/zk6118hgf,name=Yutong ZK6118HGF]]
2024-03-01 21:31:07 DEBUG [http-nio-8080-exec-7] [SYSTEM] SPARQLQueryBuilder - [3ee9392c] Query returned 33 results in 80ms 
2024-03-01 21:31:07 DEBUG [http-nio-8080-exec-7] [SYSTEM] ConceptLinkingServiceImpl - Found [33] candidates using matching [Yutong] in 82ms
2024-03-01 21:31:07 DEBUG [http-nio-8080-exec-7] [SYSTEM] ConceptLinkingServiceImpl - Generated [33] candidates in 335ms
2024-03-01 21:31:07 DEBUG [http-nio-8080-exec-7] [SYSTEM] ConceptLinkingServiceImpl - Ranked [33] candidates for mention [null] and query [Yutong] in [14] ms

@reckart
Copy link
Member

reckart commented Mar 1, 2024

After the restart of your server, querying the hierarchy to construct the concept tree for the KB page took quite long (over a minute).

@reckart
Copy link
Member

reckart commented Mar 1, 2024

I think I'll roll back the change made under this issue.

Here we have the FTS support: #4573

Might be interesting to check if the FTS-driven query also works now even if you turn the inference back on.

@tpluscode
Copy link
Author

tpluscode commented Mar 1, 2024

Inferencing is already enabled again on query.wikibus.org/query

@reckart
Copy link
Member

reckart commented Mar 1, 2024

Good. Just tested again - looks like the FTS is the solution for you then. No need to adjust the OPTIONAL :)

@reckart
Copy link
Member

reckart commented Mar 1, 2024

Just a bit of a pity that there is this little incompatibility between RDF4J and AllegroGraph right now.

reckart added a commit that referenced this issue Mar 2, 2024
reckart added a commit that referenced this issue Mar 2, 2024
* release/31.x:
  Revert "#4570 - Inefficient Knowledge Base SPARQL query for labels"
@reckart reckart added the 🗑️ Wontfix This will not be worked on label Mar 2, 2024
@reckart
Copy link
Member

reckart commented Mar 2, 2024

Superseded by #4573

@reckart reckart closed this as completed Mar 2, 2024
@reckart reckart removed this from the 31.2 milestone Mar 2, 2024
@reckart reckart added this to Kanban Aug 7, 2024
@reckart reckart moved this to 🍹 Done in Kanban Aug 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛Bug Something isn't working Module: Knowledge Base 🗑️ Wontfix This will not be worked on
Projects
Archived in project
Development

No branches or pull requests

2 participants