You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jena.apache.org by "Andy Seaborne (Jira)" <ji...@apache.org> on 2022/02/25 19:28:00 UTC
[jira] [Resolved] (JENA-2292) WKT literal (in)equality check fails
[ https://issues.apache.org/jira/browse/JENA-2292?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andy Seaborne resolved JENA-2292.
---------------------------------
Resolution: Information Provided
> WKT literal (in)equality check fails
> -------------------------------------
>
> Key: JENA-2292
> URL: https://issues.apache.org/jira/browse/JENA-2292
> Project: Apache Jena
> Issue Type: Bug
> Affects Versions: Jena 4.4.0
> Reporter: Lorenz Bühmann
> Priority: Major
>
> The inequality check of WKT literals fails in filter expression:
> {code:sql}
> PREFIX geo: <http://www.opengis.net/ont/geosparql#>
> SELECT * {
> VALUES ?wkt1 {"Point(11.416666666667 53.633333333333)"^^geo:wktLiteral "Point(11.575 48.1375)"^^geo:wktLiteral}
> VALUES ?wkt2 {"Point(11.416666666667 53.633333333333)"^^geo:wktLiteral "Point(11.575 48.1375)"^^geo:wktLiteral}
> FILTER(?wkt1 != ?wkt2)
> }
> {code}
> Equality check on the other hand works:
> {code:sql}
> PREFIX geo: <http://www.opengis.net/ont/geosparql#>
> SELECT * {
> VALUES ?wkt1 {"Point(11.416666666667 53.633333333333)"^^geo:wktLiteral "Point(11.575 48.1375)"^^geo:wktLiteral}
> VALUES ?wkt2 {"Point(11.416666666667 53.633333333333)"^^geo:wktLiteral "Point(11.575 48.1375)"^^geo:wktLiteral}
> FILTER(?wkt1 = ?wkt2)
> }
> {code}
> I don't know if this is intended by SPARQL itself for non-standard datatypes, while checking code it goes into
> {code:java}
> case VSPACE_UNKNOWN:
> {
> // One or two unknown value spaces, or one has a lang tag (but not both).
> Node node1 = nv1.asNode() ;
> Node node2 = nv2.asNode() ;
> if ( ! SystemARQ.ValueExtensions )
> // No value extensions => raw rdfTermEquals
> return NodeFunctions.rdfTermEquals(node1, node2) ;
> // Some "value spaces" are know to be not equal (no overlap).
> // Like one literal with a language tag, and one without can't be sameAs.
> if ( ! node1.isLiteral() || ! node2.isLiteral() )
> // Can't both be non-literals - that's VSPACE_NODE
> // One or other not a literal => not sameAs
> return false ;
> // Two literals at this point.
> if ( NodeFunctions.sameTerm(node1, node2) )
> return true ;
> if ( ! node1.getLiteralLanguage().equals("") ||
> ! node2.getLiteralLanguage().equals("") )
> // One had lang tag but weren't sameNode => not equals
> return false ;
> raise(new ExprEvalException("Unknown equality test: "+nv1+" and "+nv2)) ;
> throw new ARQInternalErrorException("raise returned (sameValueAs)") ;
> } {code}
> and here indeed {{NodeFunctions.sameTerm(node1, node2)}} returns false but this isn't forwarded as return value but instead an exception is thrown, thus, inequality check in a filter always leads to error and thus false.
> It also will fail for equality check of non equal WKT literals of course, all cases here:
> {code:sql}
> PREFIX geo: <http://www.opengis.net/ont/geosparql#>
> SELECT * {
> BIND("Point(11.416666666667 53.633333333333)"^^geo:wktLiteral = "Point(11.416666666667 53.633333333333)"^^geo:wktLiteral AS ?equal_true)
> BIND("Point(11.416666666667 53.633333333333)"^^geo:wktLiteral = "Point(11.575 48.1375)"^^geo:wktLiteral AS ?equal_false)
>
> BIND("Point(11.416666666667 53.633333333333)"^^geo:wktLiteral != "Point(11.575 48.1375)"^^geo:wktLiteral AS ?not_equal_true)
> BIND("Point(11.416666666667 53.633333333333)"^^geo:wktLiteral != "Point(11.416666666667 53.633333333333)"^^geo:wktLiteral AS ?not_equal_false)
> }
> {code}
> Result:
> {noformat}
> +------------+-------------+----------------+-----------------+
> | equal_true | equal_false | not_equal_true | not_equal_false |
> +------------+-------------+----------------+-----------------+
> | true | | | false |
> +------------+-------------+----------------+-----------------+{noformat}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)