rdf4j icon indicating copy to clipboard operation
rdf4j copied to clipboard

DirectTypeHierarchyInferencer queries are broken and tests are missing

Open amivanoff opened this issue 2 years ago • 2 comments

Current Behavior

DirectTypeHierarchyInferencer fails during SAIL stack initialization. It looks, some queries inside DirectTypeHierarchyInferencer are broken after SeRQL refactoring in #2992.

Caused by: java.lang.RuntimeException: org.eclipse.rdf4j.query.MalformedQueryException: Lexical error at line 1, column 85.  Encountered: " " (32), after : "X"
	at org.eclipse.rdf4j.sail.inferencer.fc.DirectTypeHierarchyInferencer.<clinit>(DirectTypeHierarchyInferencer.java:117)
	... 51 more
Caused by: org.eclipse.rdf4j.query.MalformedQueryException: Lexical error at line 1, column 85.  Encountered: " " (32), after : "X"
	at org.eclipse.rdf4j.query.parser.sparql.SPARQLParser.parseQuery(SPARQLParser.java:205)
	at org.eclipse.rdf4j.query.parser.QueryParserUtil.parseQuery(QueryParserUtil.java:93)
	at org.eclipse.rdf4j.query.parser.QueryParserUtil.parseGraphQuery(QueryParserUtil.java:129)
	at org.eclipse.rdf4j.sail.inferencer.fc.DirectTypeHierarchyInferencer.<clinit>(DirectTypeHierarchyInferencer.java:97)
	... 51 more
Caused by: org.eclipse.rdf4j.query.parser.sparql.ast.TokenMgrError: Lexical error at line 1, column 85.  Encountered: " " (32), after : "X"
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilderTokenManager.getNextToken(SyntaxTreeBuilderTokenManager.java:3450)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.jj_ntk(SyntaxTreeBuilder.java:11081)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.Constraint(SyntaxTreeBuilder.java:2807)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.Filter(SyntaxTreeBuilder.java:2798)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.FilterOrBind(SyntaxTreeBuilder.java:2476)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.BasicGraphPattern(SyntaxTreeBuilder.java:2335)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.GraphPattern(SyntaxTreeBuilder.java:2261)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.GroupGraphPattern(SyntaxTreeBuilder.java:2187)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.WhereClause(SyntaxTreeBuilder.java:1100)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.ConstructQuery(SyntaxTreeBuilder.java:673)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.Query(SyntaxTreeBuilder.java:380)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.QueryContainer(SyntaxTreeBuilder.java:236)
	at org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilder.parseQuery(SyntaxTreeBuilder.java:38)
	at org.eclipse.rdf4j.query.parser.sparql.SPARQLParser.parseQuery(SPARQLParser.java:166)
	... 54 more

Also it looks like DirectTypeHierarchyInferencer did not have any test coverage.

Expected Behavior

DirectTypeHierarchyInferencer initializes correctly and sesame:directXxx inference works correctly.

Steps To Reproduce

No response

Version

4.0.0

Are you interested in contributing a solution yourself?

Yes

Anything else?

If its ok, I could prepare fix and add some DirectTypeHierarchyInferencer regression tests.

amivanoff avatar Sep 15 '21 16:09 amivanoff

Problems with queries are in DIRECT_SUBCLASSOF_QUERY, DIRECT_SUBPROPERTYOF_QUERY and DIRECT_TYPE_QUERY static fields.

E.g. DIRECT_SUBCLASSOF_QUERY is like this

CONSTRUCT { ?X sesame:directSubClassOf ?Y }
WHERE { ?X rdfs:subClassOf ?Y .
FILTER X != Y AND NOT EXISTS { SELECT ?Z WHERE { ?X rdfs:subClassOf ?Z. ?Z rdfs:subClassOf ?Y . FILTER ?X != ?Z AND ?Z != ?Y }}}

but should be like this

CONSTRUCT { ?X sesame:directSubClassOf ?Y }
WHERE { ?X rdfs:subClassOf ?Y .
FILTER (?X != ?Y && NOT EXISTS { SELECT ?Z WHERE { ?X rdfs:subClassOf ?Z. ?Z rdfs:subClassOf ?Y . FILTER (?X != ?Z && ?Z != ?Y) }}) }

amivanoff avatar Sep 15 '21 19:09 amivanoff

Good catch @amivanoff, thanks! Your fix would be most welcome :)

abrokenjester avatar Sep 15 '21 23:09 abrokenjester

I recently ran into this problem, and before filing a new ticket I decided to see if there was already one for it. I thus found this one, and since it has been open for a while, I decided to solve the issue by myself and then make a PR. I've already written the code and a simple test. I'll do the PR in the next few days.

manuelfiorelli avatar Jul 26 '23 18:07 manuelfiorelli

I've just made the PR

manuelfiorelli avatar Jul 28 '23 19:07 manuelfiorelli