- From: Holger Knublauch <holger@topquadrant.com>
- Date: Thu, 11 Jun 2020 19:00:56 +1000
- To: Vladimir Alexiev <vladimir.alexiev@ontotext.com>
- Cc: Håvard Ottestad <hmottestad@gmail.com>, Public Shacl W3C <public-shacl@w3.org>
- Message-ID: <f2b7aa1a-3434-9900-661e-8c457fcbb67a@topquadrant.com>
On 11/06/2020 18:04, Vladimir Alexiev wrote: > I'll change my proposal to use sh:targetShape and submit a PR against > shacl-af (because Core can't be changed). +1 > > Should sh:targetShape be a subprop of sh:target? No, we didn't do that for sh:targetClass etc either. rdfs:subPropertyOf would take us deeper into RDF Schema territory, and if sh:target remains in SHACL-AF then we cannot move sh:targetShape into Core for a future 1.1. Holger > > PS: we do intend to reuse the same "reference" shapes for both > targeting and validating the existence ("semantic type"l of nodes. > > On Thu, Jun 11, 2020, 10:16 Holger Knublauch <holger@topquadrant.com > <mailto:holger@topquadrant.com>> wrote: > > On 11/06/2020 16:15, Håvard Ottestad wrote: > >> Hi, >> >> A quick question Holger. >> >> You said "I would however introduce a new property instead of >> sh:target, because the meaning of sh:target would otherwise be >> overloaded and it is possible for targets to also be >> sh:NodeShapes in which case the result will be very surprising. >> So, IMHO it should be something like sh:targetShape (or the >> earlier, verbose sh:targetNodesConforming).” >> >> Do you have any examples of where someone would already be using >> a sh:NodeShape in sh:target? >> >> Would you reject this proposal based on that? > > This is not for me to decide, SHACL is a group effort. Let's try > to find a good compromise though :) > > The case of custom targets that are also node shapes is unlikely > in practice, albeit theoretically possible. But a stronger reason > is that we would still overload the meaning of an already defined > term. There is no reason to overload sh:target, other than that it > would only require adding a paragraph under an existing section, > and maybe that no other term needs to be introduced. However, > sh:target is a SHACL-AF feature while I assume we want > sh:targetShape to become a Core feature. This alone is a strong > incentive for a new name, alongside the four existing Core target > types. All IMHO of course. > > Holger > > >> I can then think of three solutions: >> >> 1. sh:targetShape (your proposal) >> 2. a new subclass sh:TargetNodeShap rdfs:subClassOf sh:NodeShap. >> Eg. sh:target [a sh:TargetNodeShape; ….] >> 3. a clean expansion on sh:target like how SPARQL targets work. >> Eg. sh:target [a sh:ShapeTarget; sh:shape ex:nodeShape1] >> >> Håvard >> >>> On 5 Jun 2020, at 18:18, Vladimir Alexiev >>> <vladimir.alexiev@ontotext.com >>> <mailto:vladimir.alexiev@ontotext.com>> wrote: >>> >>> Hi Holger! Thanks for the comments! >>> >>> introduce a new property instead of >>> sh:target, because the meaning of sh:target would otherwise be >>> overloaded and it is possible for targets to also be >>> sh:NodeShapes >>> >>> >>> SHACL-AF says "The algorithm that is used for this computation >>> depends on the rdf:type of the custom target (sh:target)", >>> and then specifies two such types (sh:SPARQLTarget and >>> sh:SPARQLTargetType). >>> My proposal is to use exactly sh:NodeShape as rdf:type, because >>> we've described targeting by node shape. >>> I don't see why it's confusing to use the same sh:NodeShape for >>> both targeting and its normal purpose (validation), >>> and it's important for us to be able to reuse shapes in this way >>> (see the last 2 examples). >>> >>> IMHO it should be something like sh:targetShape >>> >>> >>> I'd be fine with this (as soon as we stick with type >>> sh:NodeShape) but don't see why it's needed: >>> - my proposal: sh:target [a sh:NodeShape; ...] >>> - your proposal: sh:targetShape [a sh:NodeShape; ...] >>> >>> sh:target is polymorphic by SHACL-AF definition, so I don't see >>> why we need a specialized prop name. >>> >>> I remain very nervous about performance implications. >>> >>> >>> That was also my concern because we're paying Havard to >>> implement what we need for the Onto platform, >>> which is a limited targeting (conjunction of disjunction of >>> hasValue). >>> But Havard assures us that he's already implemented more generic >>> targeting >>> (though still not full SHACL shapes! there's only atomic sh:path) >>> and that it's efficient. >>> >>> Havard has answered with a lot more detail about performance. >>> >>> I'll add some warning that such targeting is potentially >>> expensive, and users must be careful when using it, and check >>> with their specific SHACL implementation. >>> >>> "is node N in the target of S" requires iterating over all >>> sh:targetShapes each time. This can be very expensive. >>> >>> >>> Yes, that's also a concern and we'll give Havard sizable schemas >>> (say 100 shapes, and each node matches say 5-10 shapes, being >>> the depth of the 'semantic type hierarchy"). >>> >>> The implementation cost of this feature is significant, >>> because it >>> requires the implementation of an "inverse validation" >>> algorithm. >>> Validation starts with a focus node and returns a result. >>> >>> >>> In rdf4j, validation starts with a transaction, assuming that >>> data-at-rest is valid. >>> I believe Havard can "index" all the targeting shapes, so it's >>> efficient to check all of them over the set of nodes in the >>> transaction. >>> >>> guess most of them are hard to execute in the inverse order: >>> sh:datatype, sh:nodeKind, sh:minExclusive etc, sh:minLength >>> etc, >>> sh:pattern, sh:languageIn, sh:uniqueLang, sh:lessThan etc, >>> sh:closed, >>> >>> >>> You're right in many cases. >>> Any user who selects nodes by strlen is shooting himself in the >>> foot. >>> So we better put in some warnings which constructs it's wise to >>> use in a target shape, and which ones are stupid. >>> >>> So what if we simply introduce a new target type >>> sh:targetHasValue V >>> where the targets can be identified by a direct look-up. For >>> example >>> >>> ex:KiwiShape >>> sh:targetHasValue [ >>> sh:path ex:nationality ; >>> sh:hasValue ex:NewZealand ; >>> >>> >>> We need somewhat more though: >>> >>> ex:PoliticianShape a sh:NodeShape; >>> sh:semanticTarget ( >>> [sh:path rdf:type; valueIn (dbo:Person schema:Person)] >>> [sh:path dt:type; valueIn ("politician" "president")] >>> ); >>> >>> That's what I started with, but then you guys said "filter >>> shapes are very useful", so I wrote up the more general case. >>> >>
Received on Thursday, 11 June 2020 09:01:17 UTC