Hi, I've narrowed down the differences to the counts produced by spl:objectCount() SPIN function.
SELECT * WHERE { ?this a ?TYPE_CLASS { BIND(<http://spinrdf.org/spl#objectCount>(?this, ?predicate) AS ?objCount) FILTER ( bound(?minCount) && ( ?objCount < ?minCount ) ) } UNION { BIND(<http://spinrdf.org/spl#objectCount>(?this, ?predicate) AS ?objCount) FILTER ( bound(?maxCount) && ( ?objCount > ?maxCount ) ) } UNION { FILTER bound(?valueType) ?this ?predicate ?value FILTER ( ! <http://spinrdf.org/spl#instanceOf>(?value, ?valueType) ) } } Bindings: ( ?predicate, spin:body )( ?comment, "the body of the Template" )( ?minCount, 0 )( ?TYPE_CLASS, spin:Template )( ?maxCount, 1 ) 3.15.0-SNAPSHOT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | this | TYPE_CLASS | objCount | predicate | value | ================================================================================================================================================================================================= | <http://spinrdf.org/spin#Templates> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <http://spinrdf.org/spin#ConstructTemplates> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <https://github.com/AtomGraph/Processor/blob/develop/http-tests/custom#DefaultSubjectUpdateTemplate> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <http://spinrdf.org/spin#AskTemplates> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <https://github.com/AtomGraph/Processor/blob/develop/http-tests/custom#DefaultSubjectQueryTemplate> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <http://spinrdf.org/spin#UpdateTemplates> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <http://spinrdf.org/spl#Argument> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | | <http://spinrdf.org/spin#SelectTemplates> | <http://spinrdf.org/spin#Template> | 2 | <http://spinrdf.org/spin#body> | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3.0.1 ---------------------------------------------------- | this | TYPE_CLASS | objCount | predicate | value | ==================================================== ---------------------------------------------------- I'll try to create an example now. On Tue, May 19, 2020 at 6:14 PM Andy Seaborne <a...@apache.org> wrote: > > That's a long jump. > > (and it's a SpinRDF question) > > >> Are there some obvious suspects here or do I need to create a > >> reproducible example? > > reproducible example (noting that the query has custom functions which > have names that suggest they are not proper "functions" (i.e. their > return is not a function of their arguments alone and they access the > data graph .. which might be a query). > > I can't see why it might now have answers when it didn't before. > > Andy > > On 19/05/2020 13:04, Martynas Jusevičius wrote: > > With 3.0.1, no such internal *violations* are produced. > > > > On Tue, May 19, 2020 at 2:03 PM Martynas Jusevičius > > <marty...@atomgraph.com> wrote: > >> > >> Hi, > >> > >> After upgrading our code as well as SPINRDF from 3.0.1 to > >> 3.16.0-SNAPSHOT, some constraint violation-related tests are failing. > >> > >> With 3.16.0-SNAPSHOT, it seems that a bunch of constraint violations > >> are coming from the SPIN vocabulary iself, e.g. "Attribute spin:body : > >> [0,1]" on spin:ConstructTemplates, spin:SelectTemplates etc. > >> With 3.0.1, no such internal validations are produced. > >> > >> The models being validated use a basic RDFS inference (subclassing etc.) > >> > >> I have tracked the source of the difference to query execution in > >> SPINConstraints.runQueryOnClass(): > >> https://github.com/spinrdf/spinrdf/blob/master/src/main/java/org/spinrdf/constraints/SPINConstraints.java#L614 > >> > >> Since SPINRDF code hasn't changed, only the Jena versions, could there > >> be differences in query execution? The specific query that produces > >> different results is this: > >> > >> CONSTRUCT > >> { > >> _:c0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> > >> <http://spinrdf.org/spin#ConstraintViolation> . > >> _:c0 <http://spinrdf.org/spin#violationRoot> ?this . > >> _:c0 <http://spinrdf.org/spin#violationPath> ?predicate . > >> } > >> WHERE > >> { ?this a ?TYPE_CLASS > >> { FILTER ( bound(?minCount) && ( > >> <http://spinrdf.org/spl#objectCount>(?this, ?predicate) < ?minCount ) > >> ) } > >> UNION > >> { FILTER ( bound(?maxCount) && ( > >> <http://spinrdf.org/spl#objectCount>(?this, ?predicate) > ?maxCount ) > >> ) } > >> UNION > >> { FILTER bound(?valueType) > >> ?this ?predicate ?value > >> FILTER ( ! <http://spinrdf.org/spl#instanceOf>(?value, > >> ?valueType) ) > >> } > >> } > >> > >> The query string and initial bindings are the same with both versions, > >> for example: > >> > >> ( ?predicate, spin:body )( ?comment, "the body of the Template" )( > >> ?minCount, 0 )( ?TYPE_CLASS, spin:Template )( ?maxCount, 1 ) > >> > >> Are there some obvious suspects here or do I need to create a > >> reproducible example? > >> > >> Thanks, > >> > >> Martynas