On 21/02/2020 06:04, Gary Murphy wrote:
Just to follow up on that last example, which even I don't think should ever work, here's another that I was nearly certain would do something:

ex:AggregateRatingShape
  a sh:NodeShape ;
  sh:property [
      sh:path schema:reviewCount ;
      sh:or (
        [ sh:minCount 1 ]
        [ sh:node [
            sh:property [
              sh:path (
                [ sh:inversePath schema:reviewCount ]
                schema:ratingCount );
              sh:minCount 1 ;
            ] ;
          ];
        ]
      ) ;
    ];
  sh:targetClass schema:AggregateRating ;
.

And this is where I'd like to ask some naive questions about sh:inversePath

in the parent/child example, the schema:children triple doesn't actually exist however the value is inferred, given sh:values by tracing an incoming sh:inversePath schema:parent.  Is it fair to say that a sh:property (or PropertyShape) uses sh:path to "place the context pointer" at the Object value? (ie ?s ?path ?Object)  and so we test datatype, class etc of that graph node, and sh:node would place us also at that Object?  I had hoped that from sh:node I could draw a sh:inversePath back to give me the ?s of this triple, ie the instance of the class that the NodeShape lists as sh:targetClass, and so, from there, I had hoped to draw a new sh:path out to that alternate schema:ratingCount value to test for a minCount.  I get confused just describing it.

if I use sh:inversePath at the sh:NodeShape level (outside of sh:property blocks) does this make the context now some subject ?s that links to this sh:targetClass instance via the property provided as the 'argument' to sh:inversePath, while using it within sh:PropertyShape it is referring to ?Object indicated by the shape's sh:path?

I'm thinking that what I really want to do is use sh:sparql or sh:ask ...

Yes, I agree with the latter statement. That's what SHACL-SPARQL was added for, and you don't need to artificially try to get inferences, path expressions and target statements right. Note that sh:values rules are not applied by default during validation.

Holger



On Thu, Feb 20, 2020 at 9:25 AM Gary Murphy <[email protected] <mailto:[email protected]>> wrote:

    Yes, that was my original approach, but since the path is reported
    as a blank node, the alternativePath itself, and not the specific
    alternative that tripped the violation, I've lost the path
    information.  I know it is an unusual and extraneous demand, but
    legacy code wants to know ....

    using the message to decide is an awkward possibility. It means
    dual-purposing a data item and it also forms a technical debt
    should the application someday support other languages.

    I also tried convoluted paths in hopes of chaining inversePath
    with the alternate as a path list, and then using that in an sh:or
    like

    sh:path schema:ratingCount ;
    sh:or (
        [ sh:path ( [ sh:inversePath schema:ratingCount ]
    schema:reviewCount ) ; minCount 1 ]
        [ sh:minCount 1 ]
    );

    but needless to say that didn't work either.  It seemed like a
    good idea at the time, and I'm not at all certain I fully
    understand inversePath, but when the engine gets to the second
    sh:or case I think it is saying that it doesn't know who this
    minCount is referencing.

    On Wed, Feb 19, 2020 at 8:21 PM Holger Knublauch
    <[email protected] <mailto:[email protected]>> wrote:

        I think a path of ratingCount|reviewCount with sh:minCount 1
        is the cleanest approach. So if the blank node isn't very
        meaningful yet, maybe you'd need to adjust the results display
        accordingly? You could also specify a nice sh:message to
        explain what's really going on at the property shape.

        ex:AggregateRatingShape
            a sh:NodeShape ;
            sh:targetClass schema:AggregateRating ;
            sh:property [
                sh:path [ sh:alternativePath ( schema:ratingCount
        schema:reviewCount ) ] ;
                sh:minCount 1 ;
                sh:message "AggregateRating can have either or both of
        ratingCount and reviewCount" ;
            ] .

        Of course you'd also need the individual property shapes for
        the two properties, with no sh:minCount.

        Alternatively, use sh:or at the node shape, yet that might
        even be more complicating.

        Holger


        On 20/02/2020 07:31, Gary Murphy wrote:
        I have an application where I use the validation
        sh:resultPath to display violation messages, but I've hit a
        conundrum with dependent/contingent properties

        a simple example: schema:AggregateRating can have either or
        both of ratingCount and reviewCount, with a structure as follows:

          {
            "@context": { "@vocab": "http://schema.org/"; },
           "@type": "AggregateRating",
            "ratingCount": 25,
            "ratingValue": "3.5",
            "reviewCount": 5,
            "@id": "http://schemaapp.com/db/SchemaApp#AggregateRating";
        }

        what I would like to do is to attach a PropertyShape with a
        sh:path schema:reviewCount that will pass if either (or both)
        properties are present, but return a violation (with
        sh:resultPath schema:reviewCount) if both are missing

        It was very easy to phrase using sh:alternativePath in a
        NodeShape, but that gives the sh:alternativePath blank
        node as the resultPath.  I might be stuck with that, but
        hoping there's a way to do it the way I need
-- Gary Lawrence Murphy <[email protected]
        <mailto:[email protected]>> - Hunch Manifest, 15 Wyndham N
        'C', Guelph
-- You received this message because you are subscribed to the
        Google Groups "TopBraid Suite Users" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to
        [email protected]
        <mailto:[email protected]>.
        To view this discussion on the web visit
        
https://groups.google.com/d/msgid/topbraid-users/CADnyxpsmyhQ7j7-qYDdu87iPvQ6Fo09je97%3DStwqzK3cj5N55Q%40mail.gmail.com
        
<https://groups.google.com/d/msgid/topbraid-users/CADnyxpsmyhQ7j7-qYDdu87iPvQ6Fo09je97%3DStwqzK3cj5N55Q%40mail.gmail.com?utm_medium=email&utm_source=footer>.
-- You received this message because you are subscribed to the
        Google Groups "TopBraid Suite Users" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to
        [email protected]
        <mailto:[email protected]>.
        To view this discussion on the web visit
        
https://groups.google.com/d/msgid/topbraid-users/a015277b-e436-b190-1893-fa5507b6f820%40topquadrant.com
        
<https://groups.google.com/d/msgid/topbraid-users/a015277b-e436-b190-1893-fa5507b6f820%40topquadrant.com?utm_medium=email&utm_source=footer>.



-- Gary Lawrence Murphy <[email protected]
    <mailto:[email protected]>> - Hunch Manifest, 15 Wyndham N 'C',
    Guelph



--
Gary Lawrence Murphy <[email protected] <mailto:[email protected]>> - Hunch Manifest, 15 Wyndham N 'C', Guelph
--
You received this message because you are subscribed to the Google Groups "TopBraid Suite Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To view this discussion on the web visit https://groups.google.com/d/msgid/topbraid-users/CADnyxpvwrsxjT9PVx%3DEV0SD%2BVc%3D9xZ%2B91%2B9e1BrXpxZ6br_Vcg%40mail.gmail.com <https://groups.google.com/d/msgid/topbraid-users/CADnyxpvwrsxjT9PVx%3DEV0SD%2BVc%3D9xZ%2B91%2B9e1BrXpxZ6br_Vcg%40mail.gmail.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups "TopBraid 
Suite Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/topbraid-users/8b8d29e6-7352-430a-2949-0d6bbad385fb%40topquadrant.com.

Reply via email to