nexus icon indicating copy to clipboard operation
nexus copied to clipboard

SPARQL View: expose error message in payload when failing to execute a SPARQL query

Open samuel-kerrien opened this issue 4 years ago • 1 comments

Is there a way to get a user friendly error message when I execute an invalid SPARQL statement ? That would allow nexus-web to show a hint when the query blows up on the server side …

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/sparql-query" "${NEXUS_BASE}/v1/views/my_org/my_project/graph/sparql" -d 'SELECT ?a WHERE {?a a ?b} LIMI 3'

As an example, here I wrote LIMI instead of LIMIT … the returned payload:

"SPARQL-QUERY: queryStr=SELECT ?a WHERE {?a a ?b} LIMI 3\njava.util.concurrent.ExecutionException: org.openrdf.query.MalformedQueryException: Lexical error at line 1, column 31.  Encountered: \" \" (32), after : \"LIMI\"\n\tat java.util.concurrent.FutureTask.report(FutureTask.java:122)\n\tat java.util.concurrent.FutureTask.get(FutureTask.java:192)\n\tat com.bigdata.rdf.sail.webapp.BigdataServlet.submitApiTask(BigdataServlet.java:294)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet.doSparqlQuery(QueryServlet.java:678)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet.doPost(QueryServlet.java:275)\n\tat com.bigdata.rdf.sail.webapp.RESTServlet.doPost(RESTServlet.java:269)\n\tat com.bigdata.rdf.sail.webapp.MultiTenancyServlet.doPost(MultiTenancyServlet.java:195)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:707)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\n\tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\n\tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\n\tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)\n\tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.server.Server.handle(Server.java:503)\n\tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)\n\tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)\n\tat org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)\n\tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)\n\tat org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\n\tat org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)\n\tat java.lang.Thread.run(Thread.java:748)\nCaused by: org.openrdf.query.MalformedQueryException: Lexical error at line 1, column 31.  Encountered: \" \" (32), after : \"LIMI\"\n\tat com.bigdata.rdf.sail.sparql.Bigdata2ASTSPARQLParser.parseQuery2(Bigdata2ASTSPARQLParser.java:404)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet$SparqlQueryTask.call(QueryServlet.java:741)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet$SparqlQueryTask.call(QueryServlet.java:695)\n\tat com.bigdata.rdf.task.ApiTaskForIndexManager.call(ApiTaskForIndexManager.java:68)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\t... 1 more\nCaused by: com.bigdata.rdf.sail.sparql.ast.TokenMgrError: Lexical error at line 1, column 31.  Encountered: \" \" (32), after : \"LIMI\"\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilderTokenManager.getNextToken(SyntaxTreeBuilderTokenManager.java:3994)\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilder.jj_ntk(SyntaxTreeBuilder.java:9633)\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilder.SolutionModifier(SyntaxTreeBuilder.java:1386)\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilder.SelectQuery(SyntaxTreeBuilder.java:374)\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilder.Query(SyntaxTreeBuilder.java:324)\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilder.QueryContainer(SyntaxTreeBuilder.java:212)\n\tat com.bigdata.rdf.sail.sparql.ast.SyntaxTreeBuilder.parseQuery(SyntaxTreeBuilder.java:32)\n\tat com.bigdata.rdf.sail.sparql.Bigdata2ASTSPARQLParser.parseQuery2(Bigdata2ASTSPARQLParser.java:336)\n\t... 7 more\n"

Here the message in to be found in:

java.util.concurrent.ExecutionException > org.openrdf.query.MalformedQueryException, message: "Lexical error at line 1, column 31.  Encountered: \" \" (32), after : \"LIMI\"\n\t"

an other example:

curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/sparql-query" "${NEXUS_BASE}/v1/views/my_org/my_project/graph/sparql" -d 'SELECT ?a WHERE {?a a :foobar} LIMIT 3'

(!) note the :foobar prefix that wasn't define

"SPARQL-QUERY: queryStr=SELECT ?a WHERE {?a a :foobar} LIMIT 3\njava.util.concurrent.ExecutionException: org.openrdf.query.MalformedQueryException: com.bigdata.rdf.sail.sparql.ast.VisitorException: QName ':foobar' uses an undefined prefix\n\tat java.util.concurrent.FutureTask.report(FutureTask.java:122)\n\tat java.util.concurrent.FutureTask.get(FutureTask.java:192)\n\tat com.bigdata.rdf.sail.webapp.BigdataServlet.submitApiTask(BigdataServlet.java:294)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet.doSparqlQuery(QueryServlet.java:678)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet.doPost(QueryServlet.java:275)\n\tat com.bigdata.rdf.sail.webapp.RESTServlet.doPost(RESTServlet.java:269)\n\tat com.bigdata.rdf.sail.webapp.MultiTenancyServlet.doPost(MultiTenancyServlet.java:195)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:707)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\n\tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\n\tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\n\tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)\n\tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.server.Server.handle(Server.java:503)\n\tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)\n\tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)\n\tat org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)\n\tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)\n\tat org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\n\tat org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)\n\tat java.lang.Thread.run(Thread.java:748)\nCaused by: org.openrdf.query.MalformedQueryException: com.bigdata.rdf.sail.sparql.ast.VisitorException: QName ':foobar' uses an undefined prefix\n\tat com.bigdata.rdf.sail.sparql.PrefixDeclProcessor.process(PrefixDeclProcessor.java:173)\n\tat com.bigdata.rdf.sail.sparql.Bigdata2ASTSPARQLParser.parseQuery2(Bigdata2ASTSPARQLParser.java:342)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet$SparqlQueryTask.call(QueryServlet.java:741)\n\tat com.bigdata.rdf.sail.webapp.QueryServlet$SparqlQueryTask.call(QueryServlet.java:695)\n\tat com.bigdata.rdf.task.ApiTaskForIndexManager.call(ApiTaskForIndexManager.java:68)\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n\t... 1 more\nCaused by: com.bigdata.rdf.sail.sparql.ast.VisitorException: QName ':foobar' uses an undefined prefix\n\tat com.bigdata.rdf.sail.sparql.PrefixDeclProcessor$QNameProcessor.visit(PrefixDeclProcessor.java:222)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTQName.jjtAccept(ASTQName.java:26)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:592)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTObjectList.jjtAccept(ASTObjectList.java:24)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:676)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTPropertyListPath.jjtAccept(ASTPropertyListPath.java:26)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:838)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTTriplesSameSubjectPath.jjtAccept(ASTTriplesSameSubjectPath.java:23)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:274)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTBasicGraphPattern.jjtAccept(ASTBasicGraphPattern.java:24)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:442)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTGraphPatternGroup.jjtAccept(ASTGraphPatternGroup.java:24)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:880)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTWhereClause.jjtAccept(ASTWhereClause.java:25)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:742)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTSelectQuery.jjtAccept(ASTSelectQuery.java:25)\n\tat com.bigdata.rdf.sail.sparql.ast.SimpleNode.childrenAccept(SimpleNode.java:153)\n\tat com.bigdata.rdf.sail.sparql.ASTVisitorBase.visit(ASTVisitorBase.java:688)\n\tat com.bigdata.rdf.sail.sparql.ast.ASTQueryContainer.jjtAccept(ASTQueryContainer.java:25)\n\tat com.bigdata.rdf.sail.sparql.PrefixDeclProcessor.process(PrefixDeclProcessor.java:170)\n\t... 8 more\n"

Here the message in to be found in:

java.util.concurrent.ExecutionException > org.openrdf.query.MalformedQueryException > com.bigdata.rdf.sail.sparql.ast.VisitorException: message "QName ':foobar' uses an undefined prefix\n\tat 

Can we update the format of the error payload to:

  1. make it something a client can present to its client

Can Fusion present the detailed error message to the user ? even if only the full stacktrace this is already useful. Maybe under a collapsible Error details

Below is the current presentation of SPARQL errors in Fusion v1.7.0-M4-11-gc3460ab :

Screenshot 2022-02-04 at 11.31.43.png

samuel-kerrien avatar Aug 22 '19 10:08 samuel-kerrien

Delta now exposes it, can we do anything about it in Fusion?

adulbrich avatar Nov 17 '21 13:11 adulbrich

Duplicate of #3722

samuel-kerrien avatar Mar 06 '23 16:03 samuel-kerrien