Oh, I see. It does state that this is 'SHACL property value rules, a proposed extension to the SHACL-AF specification.', so not yet in the standard, and therefore not yet in pySHACL. Looks interesting, though I prefer the clarity of Datalog-based rules such as https://docs.stardog.com/inference-engine/user-defined-rules or https://docs.oxfordsemantic.tech/reasoning.html#the-rule-language-of-rdfox as opposed to the increasingly awkward ways TQ is bolting inference onto SHACL.
On Fri, May 21, 2021 at 8:48 AM richarddi...@gmail.com < richarddijkstra1...@gmail.com> wrote: > Hi Boris, > > Thank you for fixing the errors and showing how pyshacl can do it. > > The shapes do come from the TopQuadrant site: > https://www.topquadrant.com/graphql/values.html , expecting that these > would run for sure. > This explains the spif class . > > Kind regards, > Richard > > On Friday, May 21, 2021 at 2:00:32 PM UTC+2 Boris Pelakh wrote: > >> Took a look at your code and shapes, had to make a couple of little >> fixes. In your prologue, you had: >> >> data_graph_orig = data_graph >> >> That made them both reference the same graph, so there was never a >> difference. I replaced that with: >> >> data_graph_orig = Graph() >> for t in data_graph: >> data_graph_orig.add(t) >> >> to clone the data. That made the extra triples introduced by RDFS >> reasoning show up as added. I then took a look >> at your shapes, and was a little thrown off by the sh:values construct >> you used (I can't find it in SHACL-AF) and the >> use of the spif: time functions, which are not natively present in >> pySHACL (perhaps you introduced them in your >> context?). Regardless, I added the following declaration and rule: >> >> kennedys: >> a owl:Ontology ; >> owl:imports sh: ; >> sh:declare [ >> sh:prefix "kennedys" ; >> sh:namespace "http://kennedys.com/"^^xsd:anyURI ; >> ] ; >> sh:declare [ >> sh:prefix "schema" ; >> sh:namespace "http://schema.org/"^^xsd:anyURI ; >> ] . >> >> schema:PersonAgeRule >> a sh:NodeShape ; >> sh:targetClass schema:Person ; >> sh:rule [ >> a sh:SPARQLRule ; >> sh:prefixes schema: ; >> sh:construct """ >> CONSTRUCT { >> $this schema:age ?age >> } >> WHERE { >> $this schema:birthDate ?birthDate . >> FILTER NOT EXISTS { $this schema:deathDate ?any } >> bind(year(now()) - year(xsd:dateTime(CONCAT(STR(?birthDate), >> 'T00:00:00'))) as ?age) >> } >> """ ; >> ] ; >> . >> >> (The actual YEAR() function only works on dateTime, thus the date hackery) >> >> which caused the following to show up in the graph diff: >> >> (rdflib.term.URIRef('http://kennedys.com/CarolineKennedy'), >> rdflib.term.URIRef('http://schema.org/age'), rdflib.term.Literal('64', >> datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#integer'))) >> >> Hope that helps. >> On Friday, May 21, 2021 at 2:54:02 AM UTC-4 richarddi...@gmail.com wrote: >> >>> Thank you Boris for the hint. >>> >>> Inferences going into the datagraph makes sense indeed. However attached >>> example does not give the wanted result. >>> I will check this in the weekend again. >>> >>> btw I am running on Windows10 using RDFlib 5.0.0 >>> >>> Kind regards, >>> Richard >>> >>> On Thursday, May 20, 2021 at 7:50:17 PM UTC+2 Boris Pelakh wrote: >>> >>>> Richard, >>>> >>>> As per the code, it appears that triples created by inference from >>>> sh:rule are added into the data_graph, which makes sense, since you can >>>> evaluate the other rules against the inferred content. In SPARQLRule: >>>> >>>> data_graph = clone_graph(g, target_graph=data_graph) >>>> >>>> and in TripleRule: >>>> >>>> for i in iter(new_triples): >>>> data_graph.add(i) >>>> >>>> I believe this makes the new triples not accessible from the command >>>> line at this time, but if you invoke pySHACL from your own main, you should >>>> be able to inspect the data graph you passed in after running and determine >>>> the new triples introduced. >>>> >>>> On Thu, May 20, 2021 at 11:55 AM richarddi...@gmail.com < >>>> richarddi...@gmail.com> wrote: >>>> >>>>> Using shacl-af with pyshacl -a I want to materialize the inferred >>>>> triples using shacl-rules. >>>>> It is however not clear to me in what result the triples are >>>>> collected. >>>>> Any hint is appreciated. >>>>> >>>>> kind regards, Richard >>>>> >>>>> -- >>>>> http://github.com/RDFLib >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "rdflib-dev" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to rdflib-dev+...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/rdflib-dev/6cf11681-7896-472c-8237-7a951548e6d0n%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/rdflib-dev/6cf11681-7896-472c-8237-7a951548e6d0n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- > http://github.com/RDFLib > --- > You received this message because you are subscribed to a topic in the > Google Groups "rdflib-dev" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/rdflib-dev/WBH8odJKVf0/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > rdflib-dev+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/rdflib-dev/c708299c-ecf2-4a6b-9ad0-31e39371a5e8n%40googlegroups.com > <https://groups.google.com/d/msgid/rdflib-dev/c708299c-ecf2-4a6b-9ad0-31e39371a5e8n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- http://github.com/RDFLib --- You received this message because you are subscribed to the Google Groups "rdflib-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to rdflib-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/rdflib-dev/CAMNphsoko9ck_BxhS5OazN%2B5tc3b50Vp7KPf7Q%2BQa28tBsWVog%40mail.gmail.com.