Apologies for repost -- it *feels* like attaching stuff to emails is not the 
right thing to do. So, for all it's worth, as I would find it useful myself, 
files copied below. 

Many thanks, 
Pierre



- Conference_GRR_onerule.ttl --- fuseki config with TDB2 and generic rule 
reasoner
### START CONFIG ###

@prefix :      <http://base/#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix tdb2:  <http://jena.apache.org/2016/tdb#> .
@prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .

:theService a                   fuseki:Service ;
        rdfs:label                    "Service with update and query to test 
minimal dataset with inference using an instance of generic rule reasoner" ;
        fuseki:dataset                :theDataset ;
                #:tdb_dataset_readwrite ;
        fuseki:name                   "Conference1" ;
        fuseki:serviceQuery           "query" , "sparql" ;
        fuseki:serviceReadGraphStore  "get" ;
        fuseki:serviceReadWriteGraphStore
                "data" ;
        fuseki:serviceUpdate          "update" ;
        fuseki:serviceUpload          "upload" .

:theDataset a ja:RDFDataset ; 
    ja:defaultGraph <#theModel_GRR> .
                
<#theModel_GRR> a ja:InfModel ;
    ja:baseModel <#theGraph> ;
        ja:reasoner [
                ja:reasonerURL 
<http://jena.hpl.hp.com/2003/GenericRuleReasoner> ;
                ja:rulesFrom 
<file:///C:/dev/apache-jena-fuseki-3.10.0/data/conference/conference1.rules> 
        ] ;
.
                
<#theGraph> rdf:type tdb2:GraphTDB ;
   tdb2:dataset :theTDB2Dataset .
                
:theTDB2Dataset
        a              tdb2:DatasetTDB2 ;
        tdb2:location  
"C:\\dev\\apache-jena-fuseki-3.10.0\\run/databases/Conference1" ;
                tdb2:unionDefaultGraph true.

### END CONFIG ###

- conference1.ttl 
### START DATA ###

@prefix : <http://test.org#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

### OE
<http://test.org#OrganisedEvent> rdf:type owl:Class ;
        rdfs:label "organised event" .

<http://test.org#Conference> rdf:type owl:Class ;
        rdfs:subClassOf <http://test.org#OrganisedEvent> ;
        rdfs:label "conference" .
        
<http://test.org#Workshop> rdf:type owl:Class ; 
        rdfs:subClassOf <http://test.org#OrganisedEvent> ;
        rdfs:label "workshop" .

<http://test.org#hasDeadline> rdf:type owl:DatatypeProperty ;
        rdfs:domain <http://test.org#OrganisedEvent> ;
        rdfs:range xsd:dateTime ;
        rdfs:label "deadline passed" .
        
<http://test.org#Status> rdf:type owl:Class ; 
        rdfs:label "Status" .

<http://test.org#hasStatus> 
        rdf:type owl:ObjectProperty ;
        rdfs:domain <http://test.org#OrganisedEvent> ;
        rdfs:range <http://test.org#Status> ;
        rdfs:label "has status" .

<http://test.org#Status_DeadlinePassed> 
        rdf:type owl:NamedIndividual , <http://test.org#Status> ;
        rdfs:label "deadline passed" .
        
<http://test.org#Status_DeadlineActive> 
        rdf:type owl:NamedIndividual , <http://test.org#Status> ;
        rdfs:label "deadline active" .

        
### KB
<http://test.org#Conference1> rdf:type owl:NamedIndividual , 
<http://test.org#Conference> ;
        <http://test.org#hasDeadline>"2019-01-01T00:00:00Z"^^xsd:dateTime ;
        rdfs:label "1st Intl Conf of the Penguin Appreciation Society" .

<http://test.org#Conference2> rdf:type owl:NamedIndividual , 
<http://test.org#Conference> ;
        <http://test.org#hasDeadline>"3019-01-01T00:00:00Z"^^xsd:dateTime ;
        rdfs:label "101st Conf of the Penguin Appreciation Society" .

<http://test.org#Workshop1> rdf:type owl:NamedIndividual , 
<http://test.org#Workshop> ;
        <http://test.org#hasDeadline>"2018-07-01T00:00:00Z"^^xsd:dateTime ;
        rdfs:label "How to walk like a penguin" .

<http://test.org#Workshop2> rdf:type owl:NamedIndividual , 
<http://test.org#Workshop> ;
        <http://test.org#hasDeadline>"2030-07-01T00:00:00Z"^^xsd:dateTime ;
        rdfs:label "Do penguins walk?" .
        
### END DATA ###

- conference1.rules 
### START RULE###
@prefix ns: <http://test.org#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

[ruleDeadlinePassed: 
(?ev ns:hasDeadline ?date)
now(?now)
greaterThan(?now, ?date)
-> 
(?ev ns:hasStatus ns:Status_DeadlinePassed)
]
### END RULE ###



From: Pierre Grenon 
Sent: 22 May 2019 17:06
To: 'users@jena.apache.org'
Subject: RE: Documentation/tutorial on using dates in Jena rules with 
GenericRuleReasoner

Hi – yes, it works for me using fuseki as well. Apologies, I think my config 
file was bad or the data somehow. 

For reference, similar to your test: 

- Conference_GRR_onerule.ttl --- fuseki config with TDB2 and generic rule 
reasoner
- conference1.ttl --- small test set, with more than minimal data
- conference1.rules --- single (same) rule 

Query: select * where {?x <http://test.org#hasStatus> ?z}


From: Lorenz B. [mailto:buehm...@informatik.uni-leipzig.de] 
Sent: 18 May 2019 19:12
To: users@jena.apache.org
Subject: Re: Documentation/tutorial on using dates in Jena rules with 
GenericRuleReasoner


> b. I think I actually tried the rule below and I didn’t get any inference 
> result. Don’t know if it’s my config, my rule or my data. I could start a. by 
> trying to provide a dataset and config file as well. Again, anybody willing 
> to hold my hand?

THIS E-MAIL MAY CONTAIN CONFIDENTIAL AND/OR PRIVILEGED INFORMATION. 
IF YOU ARE NOT THE INTENDED RECIPIENT (OR HAVE RECEIVED THIS E-MAIL 
IN ERROR) PLEASE NOTIFY THE SENDER IMMEDIATELY AND DESTROY THIS 
E-MAIL. ANY UNAUTHORISED COPYING, DISCLOSURE OR DISTRIBUTION OF THE 
MATERIAL IN THIS E-MAIL IS STRICTLY FORBIDDEN. 

IN ACCORDANCE WITH MIFID II RULES ON INDUCEMENTS, THE FIRM'S EMPLOYEES 
MAY ATTEND CORPORATE ACCESS EVENTS (DEFINED IN THE FCA HANDBOOK AS 
"THE SERVICE OF ARRANGING OR BRINGING ABOUT CONTACT BETWEEN AN INVESTMENT 
MANAGER AND AN ISSUER OR POTENTIAL ISSUER"). DURING SUCH MEETINGS, THE 
FIRM'S EMPLOYEES MAY ON NO ACCOUNT BE IN RECEIPT OF INSIDE INFORMATION 
(AS DESCRIBED IN ARTICLE 7 OF THE MARKET ABUSE REGULATION (EU) NO 596/2014). 
(https://www.handbook.fca.org.uk/handbook/glossary/G3532m.html)
COMPANIES WHO DISCLOSE INSIDE INFORMATION ARE IN BREACH OF REGULATION 
AND MUST IMMEDIATELY AND CLEARLY NOTIFY ALL ATTENDEES. FOR INFORMATION 
ON THE FIRM'S POLICY IN RELATION TO ITS PARTICIPATION IN MARKET SOUNDINGS, 
PLEASE SEE https://www.horizon-asset.co.uk/market-soundings/. 

HORIZON ASSET LLP IS AUTHORISED AND REGULATED 
BY THE FINANCIAL CONDUCT AUTHORITY.


Works for me as expected:

|    Model m = ModelFactory.createDefaultModel();||
||    String s = "@prefix ns: <http://test.org/> .\n" +||
||               "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n" +||
||               "<s> ns:hasDeadline
\"2002-05-30T09:00:00\"^^xsd:dateTime .";||||
||    m.read(new StringReader(s), null, "Turtle");||
||
||    String rule =||
||            " [ruleMissedDeadline2: (?conference
<http://test.org/hasDeadline> ?date) now(?now) greaterThan(?now, ?date)
" +||
||                    "-> (?conference <http://test.org/status>
<http://test.org/DeadlinePassed>)]";||
||
||    List rules = Rule.parseRules(rule);||
||    Reasoner reasoner = new GenericRuleReasoner(rules);||
||    Model infModel = ModelFactory.createInfModel(reasoner, m);||
||    infModel.write(System.out, "N-Triples");|



> Give a shout.
>
> Thanks,
> Pierre
>
> From: Lorenz B. [mailto:buehm...@informatik.uni-leipzig.de]
> Sent: 17 May 2019 07:24
> To: users@jena.apache.org
> Subject: Re: Documentation/tutorial on using dates in Jena rules with 
> GenericRuleReasoner
>
> Hi,
>
>> Hi Lorenz,
>>
>> Thank you for your answer.
>>
>> Quick follow up.
>>
>> I think the issue for me is the documentation of the built-ins is too 
>> abstract or relies on understanding the source code. So I suppose, 
>> documentation / tutorial seems somewhat superfluous when you can do that – 
>> only I can’t understand what’s there and the source at the moment.
> I can see that it might be too abstract for people coming from different
> areas, sure. But, the question is who is able to provide such a tutorial
> and also who has the time. It's always a trade-off in Open Source
> projects like Jena - I guess most of the devs or other project related
> people here are not getting payed, and clearly such a tutorial for most
> if not all of the built-ins definitely needs some effort. Ideally, the
> community could take over those things, but looks like nobody ever wrote
> blog posts or tutorials about the Jena rule system and its built-ins.
>>
>>
>> 1. Yes, I seem to understand difference is a no go but I was wondering if 
>> there might be some work around coercing the dateTime to something else. I’m 
>> not sure I understood that very well but it looks like I can’t use functions 
>> in arguments of built-ins (so no xsd:year(?date) or whatever).
> I don't think you can use functions or expressions from the SPARQL
> engine resp. its XPath constructors. Both are totally different
> implementations I guess - but again, I'm not a developer, so I can't
> make a valid statement, except for looking into the code and the docs.
> From my point of view, only the mentioned built-ins from the docs are
> valid so far.
>>
>>
>> But then, on greaterThan, something should be workable if I have 
>> xsd:dateTime, no?
>>
>> What’s wrong with :
>>
>>
>>
>> [ruleMissedDeadline2:
>>
>> (?conference ns:hasDeadline ?date)
>>
>> now(?now)
>>
>> greaterThan(?now, ?date)
>>
>> ->
>>
>> (?conference ns:status ns:DeadlinePassed)
>>
>> ]
> Well I was clearly thinking too complicated, so yes, your rule should
> work given that the docs say
>
>> lessThan(?x, ?y), greaterThan(?x, ?y)
>> le(?x, ?y), ge(?x, ?y)
>>
>> Test if x is <, >, <= or >= y. Only passes if both x and y are numbers
>> or time instants (can be integer or floating point or XSDDateTime).
> I was more thinking about things like inferring the age of a person
> isn't possible right now, but would clearly be some nice to have feature
> such that you could have it as implicit fact in your KB without the need
> to change the asserted data every year.
>
>> 2. When you say extend the rule system, you mean adding a class using as a 
>> starting point something is in ..rulesys.builtins and adapting it and then 
>> rebuild all the jars. I’m using Fuseki, so I’d have to rebuild that too, 
>> yeah? Aside from the fact I’m not coding in java, this isn’t the easiest 
>> path for me at the moment.
> That's also something I can't answer properly. I mean, yes, you can
> create custom built-ins and register those or maybe create an overriding
> registry [1] ? But not sure, it looks like at least the overriding
> registry would have to be used by the rule parser, so I don't know how
> you would have to combine it with Fuseki. And in the end, yes, you have
> to repackage Fuseki I think as long as you modify the existing
> BuiltinRegistry.
>
> Maybe there is also some other kind of plugin system here, but that can
> only be answered by Andy, Dave, Adam, etc.
>
>
> [1] 
> https://issues.apache.org/jira/browse/JENA-1204<https://issues.apache.org/jira/browse/JENA-1204>
>
>> Many thanks,
>> Pierre
>>
>>
>> From: Lorenz B. [mailto:buehm...@informatik.uni-leipzig.de]
>> Sent: 16 May 2019 08:33
>> To: users@jena.apache.org
>> Subject: Re: Documentation/tutorial on using dates in Jena rules with 
>> GenericRuleReasoner
>>
>> I'm not aware of any tutorial, but afaik you can't do what you did here
>> with SPARQL in Jena rules without writing custom built-ins or by
>> extending the existing ones because:
>>
>> * the "difference" built-in does only work for numbers right now [1]
>>
>> * there is no support for duration type at all it looks like
>>
>>
>> So, so far you could only compare datetime values via lessThan, le,
>> greaterThan, ge but there is no other built-in with support for date
>> values so far. Others might indeed correct me if I'm wrong of.
>>
>>
>> It looks like, you have to extend the rule system by custom built-ins -
>> it's not that difficult though [2]
>>
>> [1]
>> https://github.com/apache/jena/blob/master/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/builtins/Difference.java#L68<https://github.com/apache/jena/blob/master/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/builtins/Difference.java#L68><https://github.com/apache/jena/blob/master/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/builtins/Difference.java#L68<https://github.com/apache/jena/blob/master/jena-core/src/main/java/org/apache/jena/reasoner/rulesys/builtins/Difference.java#L68>>
>> [2] 
>> https://jena.apache.org/documentation/inference/#builtins<https://jena.apache.org/documentation/inference/#builtins><https://jena.apache.org/documentation/inference/#builtins<https://jena.apache.org/documentation/inference/#builtins>>
>>
>>> Could people recommend a good reference/tutorial on how to use built-ins 
>>> (greaterThan, difference, now etc) with dates (e.g., datetime, duration and 
>>> so on) in rules for the GenericRuleReasoner?
>>>
>>> Example:
>>>
>>> Assume a KB of conferences with their deadlines as xsd:dateTime.
>>>
>>> Here are examples of SPARQL queries to find conferences whose deadlines are 
>>> passed:
>>>
>>> SELECT * WHERE {
>>> ?subject here:hasDeadline ?date .
>>> BIND((xsd:dateTime(?date) - now()) AS ?Span)
>>> FILTER(?Span < "P0D"^^xsd:duration)
>>> }
>>>
>>> SELECT * WHERE {
>>> ?subject here:hasDeadline ?date .
>>> FILTER(now() > xsd:dateTime(?date))
>>> }
>>>
>>> Suppose instead I wanted to infer some attribute of the conference, e.g:
>>>
>>> ?subject here:hasStatus here:DeadlinePassed
>>>
>>> I don't really get how to do that in a rule and I can't quite figure if I'm 
>>> misusing the built-ins or just mixing SPARQL and rule syntax (e.g., when 
>>> trying to coerce variables to datatypes).
>>>
>>> There's a bunch of recurring questions around that sort of rules but I 
>>> can't quite find any answer that's giving clear examples.
>>>
>>> Thus I would find it useful if anybody could point at a resource that goes 
>>> through some sort of how to do date comparison and use that in rules as the 
>>> Jena doc on built-in is not self-contained in that respect.
>>>
>>> https://jena.apache.org/documentation/inference/#rules<https://jena.apache.org/documentation/inference/#rules><https://jena.apache.org/documentation/inference/#rules<https://jena.apache.org/documentation/inference/#rules>>
>>>
>>>
>>> With many thanks and kind regards,
>>> Pierre
>>>
>> --
>> Lorenz Bühmann

Reply via email to