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

Andy Seaborne edited comment on JENA-2355 at 10/5/23 3:23 PM:
--------------------------------------------------------------

It should be made consistent.

It is a consequence of XSD arithmetic that all 4 cases usually need to be 
handled as promote to integer, decimal, float or double as appropriate. 


was (Author: andy.seaborne):
It should be made consistent.

Ir is a consequence of XSD arithmetic that all 4 cases usually need to be 
handled as promote to integer, decimal, float or double as appropriate.

> Rule Math Builtins do not support xsd:decimal
> ---------------------------------------------
>
>                 Key: JENA-2355
>                 URL: https://issues.apache.org/jira/browse/JENA-2355
>             Project: Apache Jena
>          Issue Type: Bug
>          Components: Reasoners
>    Affects Versions: Jena 4.9.0
>            Reporter: Jan Martin Keil
>            Priority: Major
>
> The [builtin|https://jena.apache.org/documentation/inference/#RULEbuiltins] 
> math functions of the rule reasoners do not properly support xsd:decimal. For 
> example, sum(1.1, 1.1) = 2.0 (returned as integer) and quotient(0.1, 0.1) 
> throws "ArithmeticException: / by zero". Here some detailed tests:
> {code:java}
> import org.apache.jena.rdf.model.*;
> import org.apache.jena.reasoner.rulesys.GenericRuleReasoner;
> import org.apache.jena.reasoner.rulesys.Rule;
> import org.apache.jena.riot.Lang;
> import org.apache.jena.riot.RDFParser;
> import org.junit.jupiter.api.Assertions;
> import org.junit.jupiter.api.Test;
> public class ApacheJenaRuleDecimalTest {
>     Property a = ResourceFactory.createProperty("http://example/a";);
>     Property b = ResourceFactory.createProperty("http://example/b";);
>     Property sum = ResourceFactory.createProperty("http://example/sum";);
>     Property difference = 
> ResourceFactory.createProperty("http://example/difference";);
>     Property product = 
> ResourceFactory.createProperty("http://example/product";);
>     Property quotient = 
> ResourceFactory.createProperty("http://example/quotient";);
>     String rules =
>             "(?r <http://example/a> ?a) (?r <http://example/b> ?b) sum(?a, 
> ?b, ?c) -> (?r <http://example/sum> ?c) ." +
>                     "(?r <http://example/a> ?a) (?r <http://example/b> ?b) 
> difference(?a, ?b, ?c) -> (?r <http://example/difference> ?c) ." +
>                     "(?r <http://example/a> ?a) (?r <http://example/b> ?b) 
> product(?a, ?b, ?c) -> (?r <http://example/product> ?c) ." +
>                     "(?r <http://example/a> ?a) (?r <http://example/b> ?b) 
> quotient(?a, ?b, ?c) -> (?r <http://example/quotient> ?c) .";
>     GenericRuleReasoner reasoner = new 
> GenericRuleReasoner(Rule.parseRules(rules));
>     @Test
>     public void test1k0() {
>         Model model = ModelFactory.createDefaultModel();
>         RDFParser.fromString(
>                         "<http://example/decimal-decimal> <http://example/a> 
> 1.0 ; <http://example/b> 1.0 ." +
>                                 "<http://example/double-decimal> 
> <http://example/a> 1.0e0 ; <http://example/b> 1.0 ." +
>                                 "<http://example/decimal-double> 
> <http://example/a> 1.0 ; <http://example/b> 1.0e0 ." +
>                                 "<http://example/double-double> 
> <http://example/a> 1.0e0 ; <http://example/b> 1.0e0 .")
>                 .lang(Lang.TTL).parse(model);
>         System.out.println("Original Statement:");
>         model.listStatements().forEach(s -> System.out.println(s));
>         System.out.println("Deducted Statement:");
>         InfModel infModel = ModelFactory.createInfModel(reasoner, model);
>         infModel.getDeductionsModel().listStatements().forEach(s -> 
> System.out.println(s));
>         infModel.getDeductionsModel().listStatements(null, sum, (RDFNode) 
> null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 2.0, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, difference, 
> (RDFNode) null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 0.0, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, product, (RDFNode) 
> null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 1.0, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, quotient, 
> (RDFNode) null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 1.0, 
> s.getSubject().getLocalName()));
>     }
>     @Test
>     public void test1k1() {
>         Model model = ModelFactory.createDefaultModel();
>         RDFParser.fromString(
>                         "<http://example/decimal-decimal> <http://example/a> 
> 1.1 ; <http://example/b> 1.1 ." +
>                                 "<http://example/double-decimal> 
> <http://example/a> 1.1e0 ; <http://example/b> 1.1 ." +
>                                 "<http://example/decimal-double> 
> <http://example/a> 1.1 ; <http://example/b> 1.1e0 ." +
>                                 "<http://example/double-double> 
> <http://example/a> 1.1e0 ; <http://example/b> 1.1e0 .")
>                 .lang(Lang.TTL).parse(model);
>         System.out.println("Original Statement:");
>         model.listStatements().forEach(s -> System.out.println(s));
>         System.out.println("Deducted Statement:");
>         InfModel infModel = ModelFactory.createInfModel(reasoner, model);
>         infModel.getDeductionsModel().listStatements().forEach(s -> 
> System.out.println(s));
>         infModel.getDeductionsModel().listStatements(null, sum, (RDFNode) 
> null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 2.2, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, difference, 
> (RDFNode) null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 0.0, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, product, (RDFNode) 
> null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 1.21, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, quotient, 
> (RDFNode) null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 1.0, 
> s.getSubject().getLocalName()));
>     }
>     @Test
>     public void test0k1() {
>         Model model = ModelFactory.createDefaultModel();
>         RDFParser.fromString(
>                         "<http://example/decimal-decimal> <http://example/a> 
> 0.1 ; <http://example/b> 0.1 ." +
>                                 "<http://example/double-decimal> 
> <http://example/a> 0.1e0 ; <http://example/b> 0.1 ." +
>                                 "<http://example/decimal-double> 
> <http://example/a> 0.1 ; <http://example/b> 0.1e0 ." +
>                                 "<http://example/double-double> 
> <http://example/a> 0.1e0 ; <http://example/b> 0.1e0 .")
>                 .lang(Lang.TTL).parse(model);
>         System.out.println("Original Statement:");
>         model.listStatements().forEach(s -> System.out.println(s));
>         System.out.println("Deducted Statement:");
>         InfModel infModel = ModelFactory.createInfModel(reasoner, model);
>         infModel.getDeductionsModel().listStatements().forEach(s -> 
> System.out.println(s));
>         infModel.getDeductionsModel().listStatements(null, sum, (RDFNode) 
> null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 0.2, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, difference, 
> (RDFNode) null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 0.0, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, product, (RDFNode) 
> null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 0.01, 
> s.getSubject().getLocalName()));
>         infModel.getDeductionsModel().listStatements(null, quotient, 
> (RDFNode) null)
>                 .forEach(s -> Assertions.assertEquals(s.getDouble(), 1.0, 
> s.getSubject().getLocalName()));
>     }
> }
>  {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to