rdf4j
rdf4j copied to clipboard
DirectTypeHierarchyInferencer queries are broken and tests are missing
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.
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) }}) }
Good catch @amivanoff, thanks! Your fix would be most welcome :)
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.
I've just made the PR