[
https://issues.apache.org/jira/browse/JENA-1376?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16100733#comment-16100733
]
Andy Seaborne commented on JENA-1376:
-------------------------------------
A workaround: move the path expression to the end of the block.
{noformat}
where {
optional {
?b_args3_name gcc:strg ?b_args3_name_string.
?b_args3 gcc:name ?b_args3_name.
?b_args3 rdf:type gcc:parm_decl.
?b_args2 gcc:chain* ?b_args3.
}
{noformat}
This works for me when directly querying the data loaded into TDB.
What is happening is that the data is of unusual shape. There are very long
chains (5000 or more) of {{gcc:chain}} with one triple at each step of the
path. This isn't the design centre for the path engine which is more for more
fan-out and less depth. The implementation uses recursion (which is not a
tail-recursion). Rewiring the algorithm to detect this case (no fan-out) and
do it specially looks possible.
The optimizer does not reorder paths in this case. So the execution is as
written - do {{?b_args2 gcc:chain* ?b_args3}} first, not using the later
restrictions on {{?b_args3}}. The rewrite above calculates candidate
{{?b_args3}} first then tries each on the path. There are 9697 solutions to
this block.
The OPTIONAL is of no effect. It could be a fixed pattern.
The query does have two unconnected parts. Was a UNION intended? As written
it is a massive cross product.
The first part - the two optional blocks has 9697 solutions.
The second part - from after the two optional blocks, has 1060 solutions.
The first and second part are not connected by any variable. There are
9697*1060 = 10,278,820 solutions. ARQ streams so finding the first 10 distinct
is quite quick but is that what was meant by the query?
> FUSEKI recursive stack overflow crash on * query in optional where clause
> -------------------------------------------------------------------------
>
> Key: JENA-1376
> URL: https://issues.apache.org/jira/browse/JENA-1376
> Project: Apache Jena
> Issue Type: Bug
> Reporter: james michael dupont
>
> changing
> {noformat}
> ?b_args2 gcc:chain ?b_args3.
> {noformat}
> to
> {noformat}
> ?b_args2 gcc:chain* ?b_args3.
> {noformat}
> causes a 500 error see http://paste.debian.net/977429/ for the full stack.
> at
> org.apache.jena.sparql.path.eval.PathEngineSPARQL.ALP_1(PathEngineSPARQL.java:133)
> {noformat}
> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> PREFIX gcc:
> <https://h4ck3rm1k3.github.io/gogccintro/gcc/ontology/2017/05/20/gcc_compiler.owl#>
> PREFIX owl: <http://www.w3.org/2002/07/owl#>
> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> select distinct
> ?b
> ?b_name_string
> ?b_args ?b_args_type ?b_args_name_string ?b_args2_name_string
> ?b_args3_name_string
> where {
>
> optional {
> ?b_args2 gcc:chain* ?b_args3.
> ?b_args3_name gcc:strg ?b_args3_name_string.
> ?b_args3 gcc:name ?b_args3_name.
> ?b_args3 rdf:type gcc:parm_decl.
> }
>
> optional {
> ?b_args gcc:chain ?b_args2.
> ?b_args2_name gcc:strg ?b_args2_name_string.
> ?b_args2 gcc:name ?b_args2_name.
> ?b_args2 rdf:type gcc:parm_decl.
> }
>
> ?b_args_name gcc:strg ?b_args_name_string.
> ?b_args gcc:name ?b_args_name.
> ?b_args rdf:type gcc:parm_decl.
>
> ?b rdf:type gcc:function_decl.
> ?b gcc:scpe ?a.
> ?b gcc:name ?b_name.
> ?b gcc:args ?b_args.
> ?b_name gcc:strg ?b_name_string.
> ?a rdf:type gcc:translation_unit_decl.
>
> }
> limit 10
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)