You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jena.apache.org by "Dave Reynolds (JIRA)" <ji...@apache.org> on 2017/05/15 16:37:04 UTC

[jira] [Comment Edited] (JENA-1337) Trying to write an infered model to a String or a file never ends

    [ https://issues.apache.org/jira/browse/JENA-1337?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16010785#comment-16010785 ] 

Dave Reynolds edited comment on JENA-1337 at 5/15/17 4:36 PM:
--------------------------------------------------------------

Since you say the ontologies are "huge" they may simply be beyond the scale the rule reasoners can cope with. In which case this is not a bug so much as a scalability limitation.

However, your example code creates an ontology model with a default reasoner (which will be RDFS) and then layers a new reasoner over the top. That will be very expensive. Just create the OntModel with the appropriate reasoner in the first place - {{OntModelSpec.OWL_MEM_MICRO_RULE_INF}} in this case. Or if you really want a separate InfModel then make the base OntModel a non-reasoner configuation {{OntModelSpec.OWL_MEM}}. Let us know if this improve things at all.

Note that writing out an inferred ontology will always be expensive. If you only want specific inferences then asking more specific queries and writing the results of those out can enable you to do useful work even with ontologies that are pushing the boundaries of what the simple rule reasoners can manage.


was (Author: der):
Since you say the ontologies are "huge" they may simply be beyond the scale the rule reasoners can cope with. In which case this is not a bug such much as a scalability limitation.

However, your example code creates an ontology model with a default reasoner (which will be RDFS) and then layers a new reasoner over the top. That will be very expensive. Just create the OntModel with the appropriate reasoner in the first place - {{OntModelSpec.OWL_MEM_MICRO_RULE_INF}} in this case. Or if you really want a separate InfModel over your own then may the base OntModel a non-reasoner configuation {{OntModelSpec.OWL_MEM}}. Let us know if this improve things at all.

Note that writing on an inferred ontology will always be expensive. If you only want specific inferences then asking more specific queries and writing the results of those out  can enable you to do useful work even with ontologies that are pushing the boundaries of what the simple rule reasoners can manage.

> Trying to write an infered model to a String or a file never ends
> -----------------------------------------------------------------
>
>                 Key: JENA-1337
>                 URL: https://issues.apache.org/jira/browse/JENA-1337
>             Project: Apache Jena
>          Issue Type: Bug
>    Affects Versions: Jena 3.1.1, Jena 3.2.0
>            Reporter: Gilles Habran
>
> Good morning,
> I am trying to print an infered model but it never ends.
> The ontologies I am using are huge and can be found here : http://publications.europa.eu/mdr/cdm/index.html
> I tried with an OWL Reasoner or a Micro OWL Reasoner.
> I created a small project with a Main class, a model and the ontologies here to show the problem : https://gitlab.com/gillouche/jena-perf
> The thread dump shows that kind of stacktrace:
> {code:java}
> "main" #1 prio=5 os_prio=0 tid=0x00007f22f403f000 nid=0x3330 runnable [0x00007f22fbc92000]
>    java.lang.Thread.State: RUNNABLE
> 	at java.util.LinkedList.remove(LinkedList.java:364)
> 	at org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.detach(LPBRuleEngine.java:233)
> 	- locked <0x00000005cfe72990> (a org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine)
> 	at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.close(LPInterpreter.java:168)
> 	at org.apache.jena.reasoner.rulesys.impl.Generator.setComplete(Generator.java:160)
> 	at org.apache.jena.reasoner.rulesys.impl.Generator.postCompletionCheckScan(Generator.java:371)
> 	at org.apache.jena.reasoner.rulesys.impl.Generator.checkForCompletions(Generator.java:313)
> 	at org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.pump(LPBRuleEngine.java:364)
> 	at org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward(LPTopGoalIterator.java:107)
> 	- locked <0x00000005d58aa060> (a org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator)
> 	- locked <0x00000005cfe72990> (a org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine)
> 	at org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.hasNext(LPTopGoalIterator.java:223)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
> 	at org.apache.jena.util.iterator.Map1Iterator.hasNext(Map1Iterator.java:49)
> 	at org.apache.jena.util.iterator.NiceIterator.asSet(NiceIterator.java:208)
> 	at org.apache.jena.util.iterator.NiceIterator.toSet(NiceIterator.java:199)
> 	at org.apache.jena.graph.GraphUtil.listSubjects(GraphUtil.java:50)
> 	at org.apache.jena.riot.writer.RDFJSONWriter.output(RDFJSONWriter.java:76)
> 	at org.apache.jena.riot.writer.RDFJSONWriter.output(RDFJSONWriter.java:51)
> 	at org.apache.jena.riot.writer.RDFJSONWriter.write(RDFJSONWriter.java:63)
> 	at org.apache.jena.riot.adapters.RDFWriterRIOT.write(RDFWriterRIOT.java:74)
> 	at org.apache.jena.rdf.model.impl.ModelCom.write(ModelCom.java:358)
> 	at Main.main(Main.java:72)
> {code}
> In a Java Mission Control, the LinkedList.remove() hot methods take 80%.
> If I don't infer the model, I can print it without any problem.
> Note : I have another project using SHACL to validate an infered model against shapes. A simple model can be validated with SHACL but an infered model cannot be. The stacktrace of the thread dumps block with the same code (LPInterpreter.close() then LinkedList.remove()).
> Here is the stacktrace from a thread dump:
> {code:java}"http-nio-auto-1-exec-1" #18 daemon prio=5 os_prio=0 tid=0x00007f09592c4000 nid=0x6537 runnable [0x00007f0934e79000]
>    java.lang.Thread.State: RUNNABLE
> 	at java.util.LinkedList.remove(LinkedList.java:364)
> 	at org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.detach(LPBRuleEngine.java:233)
> 	- locked <0x00000005f3da67e0> (a org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine)
> 	at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.close(LPInterpreter.java:168)
> 	at org.apache.jena.reasoner.rulesys.impl.Generator.setComplete(Generator.java:160)
> 	at org.apache.jena.reasoner.rulesys.impl.Generator.postCompletionCheckScan(Generator.java:371)
> 	at org.apache.jena.reasoner.rulesys.impl.Generator.checkForCompletions(Generator.java:313)
> 	at org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.pump(LPBRuleEngine.java:364)
> 	at org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward(LPTopGoalIterator.java:107)
> 	- locked <0x00000005f890e638> (a org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator)
> 	- locked <0x00000005f3da67e0> (a org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine)
> 	at org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.hasNext(LPTopGoalIterator.java:223)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
> 	at org.apache.jena.util.iterator.Map1Iterator.hasNext(Map1Iterator.java:49)
> 	at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
> 	at org.topbraid.spin.util.JenaUtil.addTransitiveSubjects(JenaUtil.java:171)
> 	at org.topbraid.spin.util.JenaUtil.addTransitiveSubjects(JenaUtil.java:178)
> 	at org.topbraid.spin.util.JenaUtil.getAllTransitiveSubjects(JenaUtil.java:240)
> 	at org.topbraid.spin.util.JenaUtil.getAllTransitiveSubjects(JenaUtil.java:435)
> 	at org.topbraid.spin.util.JenaUtil.getAllSubClasses(JenaUtil.java:377)
> 	at org.topbraid.spin.util.JenaUtil.getAllInstances(JenaUtil.java:359)
> 	at org.topbraid.shacl.util.SHACLUtil.getTargetNodes(SHACLUtil.java:536)
> 	at org.topbraid.shacl.validation.ValidationEngine.validateAll(ValidationEngine.java:307)
> 	at org.topbraid.shacl.validation.ValidationUtil.validateModel(ValidationUtil.java:65)
> 	at eu.europa.ec.opoce.cellar.validation.impl.TopBraidShaclValidationService.validate(TopBraidShaclValidationService.java:25)
> 	at eu.europa.ec.opoce.cellar.validation.controller.ValidationController.validate(ValidationController.java:72)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:498)
> 	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
> 	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
> 	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
> 	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
> 	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
> 	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
> 	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
> 	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
> 	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
> 	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
> 	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
> 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
> 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
> 	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
> 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
> 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
> 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
> 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
> 	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
> 	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
> 	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
> 	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
> 	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
> 	- locked <0x00000005eddcf178> (a org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper)
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> 	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
> 	at java.lang.Thread.run(Thread.java:748){code}
> Would you have any idea what's happening? 
> Thank you.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)