- From: Tom De Nies <tom.denies@ugent.be>
- Date: Tue, 29 Jan 2013 15:18:22 +0100
- To: James Cheney <jcheney@inf.ed.ac.uk>
- Cc: Provenance Working Group <public-prov-wg@w3.org>
- Message-ID: <CA+=hbbfPPNXxaz=xY=0-uTXOxz=nMn-BUhjLUEkBs0jHqb1=UA@mail.gmail.com>
Thanks James, fixed all of those. 2013/1/29 James Cheney <jcheney@inf.ed.ac.uk> > Mostly looks OK. A few minor things: > > - In this sentence: > > Thus, :d3 does not contain the members ("k1", :e1) and ("k2", :e2( from > :d2. > > > the "(" after :e2 should be a ")" > > - in constraint 12, part 4 and 5, the rules only say what to do in the > case of a single insertion or deletion. They could be generalized to > handle sets of inserted KV pairs or sets of deleted keys. > > - maybe could you change the macro that assigns inference/constraint > numbers so that they are numbered "D1", "D2", etc.? Otherwise "inference > 5" could mean "inference 5 of prov-constraints" or "inference 5 of > prov-dictionary". Not a big deal though. > > --James > > > > On Jan 29, 2013, at 12:21 PM, Tom De Nies <tom.denies@ugent.be> wrote: > > Thanks to all reviewers for your helpful comments! > > The revised document is available here: > http://dvcs.w3.org/hg/prov/raw-file/default/dictionary/prov-dictionary.html > > Do note that the grammar, xsd and owl files are not finished yet, but will > be somewhere this week. > This is why we linked to the > http://dvcs.w3.org/hg/prov/raw-file/default/dictionary/prov-dictionary.*versions in the draft. > > Could we get some sort of acknowledgement from the reviewers that your > concerns were addressed? This way we could close this issue. > > Best regards, > Tom and Sam > > 2013/1/29 Tom De Nies <tom.denies@ugent.be> > >> Hi Stian, >> >> thanks again for your extensive review. I responded to each issue below. >> You'll see that many of the issues arose in other reviews as well, so >> they were no trouble fixing. >> >> As I see it, only one real point of discussion remains after going >> through your review: (item 3 in your review) whether or not we include the >> constraint >> IF hadMember(d, e) and 'Dictionary' \in typeOf(d) THEN >> hadDictionaryMember(d, e, "k") with k and unknown key. >> I suggest we leave this out for this draft, and make it a formal issue, >> which we can discuss as a group before the next draft. >> >> >>> Please find below detailed review: >>> >>> > 2.1 Dictionary membership >>> > key: a key key_1 that is associated with the specified entity; >>> >>> 1) This should specify that the key is a *Value* as according to >>> PROV-DM http://www.w3.org/TR/prov-dm/#term-value - as it is specified >>> it could be interpreted as also an identifier - although the PROV-N >>> example uses a "string value". (I know it is confusing because DM >>> for some reason chose to call this Value rather than the more >>> appropriate term Literal - but here in a dictionary the actual 'value' >>> is the Entity (identifier), and the key is a (literal) Value! >>> Therefore this should be clarified with DM hyperlink.) >>> >> Indeed, Luc and Paolo's review also mentioned this. It's fixed. >> >> >>> >>> > Note that dictionary membership implies collection membership, but not >>> vice versa. >>> >>> 2) This should link forward to inference 1 >>> (dictionary-membership-collection-membership) >>> >> Done. >> >> >>> >>> 3) Also I don't quite understand this. So a prov:Dictionary kind of >>> collection can have members that don't have keys? >>> >>> entity(d, [prov:type='prov:Dictionary' ]) >>> // implies: >>> entity(d, [prov:type='prov:Collection ]) >>> >>> hadDictionaryMember(d, e1, "k1") >>> // implies: >>> hadMember(d, e1) >>> >>> // But what if we also see? >>> hadMember(d, e3) >>> // are you saying this would NOT imply the below? >>> hadDictionaryMember(d, e3, ?unknownKey) >>> >>> If so then I am a bit confused - a prov:Dictionary to be useful should >>> be a constrained prov:Collection in which every member is associated >>> with a key. This should be added to the Conceptual Definition of >>> Dictionary above. >>> >>> If there is no such implication (of course the key is unknown until >>> stated otherwise), I am not sure in which cases such a data type could >>> be useful. It would be like describing an array type of collection, >>> but where some items are allowed to not have a position. (which is >>> quite different from saying they have an unknown position!) >>> >>> >> See explanation above, this remains an issue to be discussed. >> >> >>> >>> > > // d1 is a dictionary, with unknown content >>> >>> 4) Change to "with (so far) unknown content" ? Both example 1 and 2 >>> and others - specially those that later actually do state the members. >>> >>> >>> Done. >> >> >>> >>> > 2.2 Dictionary insertion >>> > d0 is the set { } >>> > ... >>> >>> 5) I thought d0 was a Dictionary, not a set. s/set/dictionary/g here >>> and in other examples. >>> >>> It is not simply a set of pairs, because we don't allow multiple >>> entries for same key. >>> >>> Fixed. >> >> >>> >>> > attributes: an optional set (attrs) of attribute-value pairs >>> representing additional information about this relation. >>> >>> 6) Could one of the lines in example 3 perhaps include a >>> dcterms:description or something? Just because it can get confusing >>> with the new {("key", value)} syntax as opposed to the attribute >>> syntax. >>> >>> >>> derivedByInsertionFrom(d2, d1, {("k3", e3)}, [ dcterms:description = >>> "An optional attribute" ] ) >>> >>> Done. >> >> >>> >>> > 2.2 Dictionary Insertion >>> > 2.3 Dictionary Removal >>> > In particular, no assumptions are needed regarding the mutability of a >>> data structure that is subject to updates >>> >>> 7) So from the examples given, it seems that both insertion and >>> removal are "complete" statements - for instance after >>> >>> derivedByRemovalFrom(d3, d2, {"k1", "k3"}) >>> >>> we conclude that "k2" remains as a key in d3. >>> >>> I very much prefer this semantics, rather than a very earlier draft, >>> where members could come and go out of the blue and you never really >>> knew much. I think also this is OK as this is a specific >>> prov:Dictionary thing rather than a general thing about >>> prov:Collection's. >>> >>> >>> Therefore 2.2 and 2.3 should clarify this and change >>> >>> > key-entity-set: the inserted key-entity pairs ( >>> to >>> > key-entity-set: all inserted key-entity pairs ( >>> >>> > key-set: a set of deleted keys (..) >>> to >>> > key-set: a set of all deleted keys (..) >>> >>> Inference 7 (insertion-removal-membership) makes this explicit (yay!) >>> - so a forward reference would be good. >>> >>> >>> Done. >> >> >>> >>> >>> 3. PROV-N Notation of Dictionary Concepts >>> >>> 8a) This section should start with a paragraph explaining that >>> PROV-DICTIONARY specifies an extension according to PROV-N Extension >>> chapter - http://www.w3.org/TR/prov-n/#extensibility - but using the >>> same namespace >>> >>> I have added the following text: >> >>> The notation used for dictionaries in this document extends the standard >>> PROV-N according to the principles described in the PROV-N >>> extensibility chapter <http://www.w3.org/TR/prov-n/#extensibility>. >>> However, because dictionaries are defined in the same namespace as the rest >>> of PROV-N, the terms in this document do not have a non-empty prefix. For >>> the remainder of this document, we will assume that the default namespace >>> http://www.w3.org/ns/prov# is used, and thus, no prefix is specified >>> for the terms associated with dictionaries. >>> >> Is this acceptable to you? >> >> >>> 8b) The extension grammar should be downloadable and linked to from >>> introduction of PROV-N notation. >>> >>> We noticed that although there is a grammar folder on the mercurial >> repository, PROV-N currently does not link to a downloadable grammar >> either. (or we couldn't find the link). >> We suggest that we wait until PROV-N does this in the final spec, and >> then conform to that when we link to it in the next draft. >> >> >>> 9) However, to be a valid extension, the terms must be given as a >>> QUALIFIED_NAME. With the proposed syntax in this document - the >>> QNAMEs are in the default name space, which can be customized in >>> PROV-N - http://www.w3.org/TR/prov-n/#expression-NamespaceDeclaration >>> - and therefore easily overlap with other extensions. >>> >>> It is not explicit in PROV-N (perhaps it should be!) - but a missing >>> default namespace declaration would make the QNAMEs invalid. >>> >>> > A qualified name's prefix is optional. If a prefix occurs in a >>> qualified name, the prefix must refer to a namespace declared in a >>> namespace declaration. In the absence of prefix, the qualified name belongs >>> to the default namespace. >>> >>> (Side note: PROV-N should require that PN_PREFIX is a declared prefix >>> in the current scope - and that if it is empty, that the default >>> namespace has been declared) >>> >>> >>> The prefix prov: is reserved in PROV-N. >>> >>> I therefore suggest to rename all the Dictionary concepts to qualified >>> names using prov:* - that is: >>> >>> prov:hadDictionaryMember >>> prov:derivedByInsertionFrom >>> prov:derivedByRemovalFrom >>> >>> Thus we would avoid the embarrassing situation of PROV-Dictionary-N >>> documents not being valid PROV-N documents - while documents using >>> other extensions would be. >>> >>> >> See the text added to the beginning of the PROV-N section, and our >> response to 8a. Does this remain a blocking issue for you now that this >> text is included? I'd like to remark that PROV-LINKS does not declare this >> namespace either, and is published as a working draft. >> http://www.w3.org/TR/prov-links/ >> >> >> >>> >>> 10) This section paragraph should mention that prov:Dictionary and >>> prov:EmptyDictionary is declared using regular entity statements (with >>> example). This could be inserted before 3.1. >>> >>> >>> Done. >> >>> >>> 3.1 Membership (PROV-N) >>> >>> > membershipExpression ::= 'hadDictionaryMember' '(' dIdentifier ',' >>> entity ',' key ')' >>> > key key (Non-Terminal) >>> >>> 11) "key" is not a defined Non-Terminal - neither here nor in PROV-N >>> document or grammar. >>> >>> "dIdentifier" is similarly a new non-Terminal that must be defined >>> here. (presumably it is an entity which is a prov:Dictionary type). >>> >>> >>> Combined with issue #1 this is very confusing, and so I have made this >>> and equivalent below a blocker. >>> >>> >>> Use the style of the PROV-N document: >>> >>> http://www.w3.org/TR/prov-n/#expression-Entity >>> >>> .. here it also introduces optionalAttributeValuePairs, etc. >>> >>> >>> >> Fixed (after previous reviews). Could you check the expressions again? I >> believe everything should be linked and defined correctly now. >> >> >>> >>> 12) This is not valid grammar according to the EBNF section of PROV-N >>> as it uses 'single quotes' rather than "double" >>> >>> http://www.w3.org/TR/prov-n/#grammar-notation >>> >>> Change this and following declaration to style with double quotes: >>> >>> > membershipExpression ::= "hadDictionaryMember" "(" dIdentifier "," >>> entity "," key ")" >>> >>> Now uses double quotes. >> >> >>> >>> 13) For some reason I was not able to copy-paste the ::== line above >>> correctly from neither Firefox nor Chrome - the 'single quotes' >>> disappeared! Why? CSS? Ensure quotes are regular characters >> >> >> This appears to be because the quotes are added through CSS. I noticed >> that in PROV-N, this is done differently now, and the expressions are >> pulled from the grammar by a javascript script that runs on the page. We >> will fix this when we create the grammar document. >> >> >>> >>> > Example 6 >>> > >>> > >>> > In this example, d is a dictionary known to have e0, e1, and e2 as >>> members, and may have other members. >>> > entity(e0) >>> > .. >>> > hadDictionaryMember(d, e0, "k0") >>> >>> >>> 14) I think this and following examples can be shortened - you should >>> not explain the PROV Dictionary semantics again in this section and >>> don't need to repeat the full examples - only the syntax of the >>> particular statement. So change style to only: >>> >>> > Example 6 >>> > // e0 is member in d under key "k0" >>> > hadDictionaryMember(d, e0, "k0") >>> >>> >>> Shortened. >> >> >>> > 3.2 Insertion >>> > derivationByInsertionFromExpression ::= derivedByInsertionFrom ( >>> identifier , dIdentifier , dIdentifier , { keyValuePairs } >>> optional-attribute-values ) >>> >>> 15) Non-Terminals not matching table below: identifier, >>> keyValuePairs, optional-attribute-values >>> Change to match table. >>> >>> >> Fixed (after previous reviews). Could you check the expressions again? I >> believe everything should be linked and defined correctly now. >> >> >> >>> 16) Not defined: dIdentifier, keyEntitySet/keyValuePairs >>> >>> Remember that for keyValuePairs the first pair is not optional. >>> >>> Fixed (after previous reviews). Could you check the expressions again? I >> believe everything should be linked and defined correctly now. >> >> >>> >>> 17) as the identifiers is optional, the separator should be ";" not >>> ",". This also applies to derivedByRemovalFrom >>> >>> Fixed. >> >> >>> >>> 18) Hyperlinks for prov-n terminals like 'identifier' are wrong - they >>> go to non-existing local anchors rather than to PROV-N - like >>> http://www.w3.org/TR/prov-n/#prod-identifier >>> >>> >>> Fixed (after previous reviews). Could you check the expressions again? I >> believe everything should be linked and defined correctly now. >> >> >>> > 3.3 Removal >>> > derivationByRemovalFromExpression ::= derivedByRemovalFrom ( >>> identifier , dIdentifier , dIdentifier , { keySet } >>> optional-attribute-values ) >>> >>> 19) optional-attribute-values -> optionalAttributeValuePairs >>> >>> Fixed. >> >> >>> >>> > key-set keySet >>> >>> 20) Undefined terminal keySet >>> >>> Remember that the first key is not optional. >>> >>> Fixed. >> >>> >>> > The following table summarizes how each constituent of a PROV-DM >>> Membership maps to a non-terminal. >>> > The following table summarizes how each constituent of a PROV-DM >>> Insertion maps to a non-terminal. >>> > The following table summarizes how each constituent of a PROV-DM >>> Removal maps to a non-terminal. >>> >>> 21) PROV-DM -> PROV-DICTIONARY (or simply Dictionary) >>> >>> >>> >>> >>> > 4. Ontological definition of dictionary >>> >>> Note that I have only checked the Turtle syntax here 'by hand' - they >>> should be formally checked programmatically. >>> >>> >> This remains a todo when we publish the owl file. >> >>> >>> > prov:hadDictionaryMember [ >>> > a prov:KeyValuePair; >>> > prov:key "k1"^^xsd:string >>> > prov:value :e1 >>> >>> 22) Fix indentation of prov:value (do NEVER use TAB character in such >>> examples as it has inconsistent rendering) >>> >>> Fixed. >> >> >>> >>> 23) Missing ; after xsd:string (invalid Turtle syntax) >>> >>> Fixed. >> >>> >>> > A dictionary may be empty, in which case it should be described as an >>> instance of the subclass prov:EmptyDictionary. >>> >>> 24) This makes sense regardless of syntax - can a similar statement be >>> made in section 2.? >>> >>> We revised this sentence after a previous review. I've added something >> similar to the conceptual definition: >> >>> Note that the complete content of a dictionary is unknown unless it can >>> be traced back to an empty dictionary through a series of insertions and >>> removals. If an asserter wants to explicitly state that a dictionary is >>> empty, it is recommended that the prov:type prov:EmptyCollection is >>> used. >> >> >> Is this ok for you? >> >> >>> >>> > PROV-O provides two kinds of involvements >>> >>> 25) PROV-O --> PROV-DICTIONARY >>> >>> Done. >> >> >>> > prov:qualifiedInsertion is used to (..) >>> > prov:qualifiedRemoval is used to specify (..) >>> >> >> 26) Text should relate/hyperlink this to the insertion/removal sections >>> earlier. >>> >>> >>> > prov:Dictionary >>> >>> > back to collections classes >>> >>> 27) hyperlink from headers - does not work. Remove or change to link >>> to "These terms are used" section. >>> >>> Done, they point to the overview now. >> >>> >>> >>> > :wasCreatedBy :bob; >>> >>> 28) Remove this as it is potentially confusing with >>> prov:wasAttributedTo (or just change to prov:wAT) >>> >>> Done. >> >>> >>> > described with properties >>> > prov:derivedByInsertionFromop prov:qualifiedRemovalop >>> prov:qualifiedInsertionop prov:derivedByRemovalFromop >>> >>> 29) Somehow the most important property, prov:hadDictionaryMember >>> seems to be missing here! >>> >>> >>> Oops! fixed. >> >> >>> > prov:EmptyDictionary >>> > >>> > :d1 a prov:Dictionary; >>> > prov:derivedByInsertionFrom :d; >>> >>> 30) I find it confusing that this example uses most lines to talk >>> about a non-empty dictionary. Simplify to just show the boring: >>> >>> > :d a prov:EmptyDictionary . >>> >>> Done >> >>> >>> > An empty dictionary. >>> >>> 31) Could you add the obvious "i.e. has no members" >>> >>> >>> Done. >> >> >>> > prov:insertedKeyValuePair [ >>> > a prov:KeyValuePair; >>> > prov:key "k1"^^xsd:string; >>> > prov:value :e1; >>> > ] >>> >>> >>> 32) I know we had discussions about this before (when this was in >>> PROV-O) as one can consider either the value or the keyvaluepair to be >>> what is inserted. But this is getting quite verbose.. >>> inserterkeyvaluepair keyvaluepair key and value! Puh! >>> >>> How about simplifying to: >>> >>> prov:inserted [ >>> a prov:KeyValuePair; >>> prov:key "k1"^^xsd:string; >>> prov:value :e1; >>> ] >>> >>> .. or possibly prov:insertedPair ? >>> >>> This is similar to how the insertion is a prov:Insertion and not a >>> prov:DictionaryInsertion. >>> >>> I would keep prov:removedKey as it's important to know it's the *key* >>> that was removed. >>> >>> >> Sam and I discussed this, and came to the following conclusion. While it >> is true that this syntax is quite verbose, it is also the only one that is >> 100% clear and cannot induce confusion or discussion. This, and the fact >> that the other reviewers did not see a problem with this property has made >> us decide that this is the safest choice, and we will keep it. If you >> consider it a serious problem, we can discuss it as an issue for the next >> draft. >> >> >>> >>> > prov:Removal >>> > removing one or more key-value pairs >>> >>> 33) Add ", specified by prov:removedKey" >>> >>> (as you don't specify the removed key/value pairs) >>> >>> done. >> >> >>> >>> > prov:dictionary >>> > has domain >>> > prov:Insertion >>> > prov:Removal >>> >>> 34) This specifies that the domain is the intersection of Insertion >>> and Removal - thus any Insertion with a prov:dictionary becomes also >>> a Removal etc. This is surely wrong. >>> >>> >>> Formally you should specify this as the domain of the union of >>> Insertion and Removal - alternatively as a common "abstract" >>> superclass prov:DictionaryInfluence. >>> >>> See PROV-O http://www.w3.org/TR/prov-o/#owl-profile >>> >>> As the union would take the extension out of OWL-RL, and there already >>> is precedence for other kind of influences, I would suggest making a >>> new prov:DictionaryInfluence which can be superclass of Insertion and >>> Removal, and in domain of prov:dictionary. >>> >>> >>> Done. >> >>> >>> >>> 35) Where can I find a download link for the OWL of this PROV >>> Dictionary extension? I expected to find it in te beginning of section >>> 4. I would also expect section 4 to have an explanation of the >>> namespaces and how importing <http://www.w3.org/ns/prov#> one would >>> get both PROV-O and extensions like PROV-Dictionary, while >>> <http://www.w3.org/ns/prov-o> would give only PROV-O. I would then >>> also expect a separate versionIRI to import if I only wanted >>> PROV-Dictionary - like <http://www.w3.org/ns/prov-dictionary#> >>> >>> >>> As discussed on the call, we included a link to the owl file in the >> document, but the file itself might still be updated. (we linked to the raw >> "editor's draft" version, to allow ourselves some time to update and verify >> the owl syntax.) >> I''ve also included the text you asked for: >> >>> The classes and properties defined in this document will be included in >>> the default namespace of PROV. Users of the ontology have the option of >>> importing<http://www.w3.org/ns/prov#>, which includes all extensions, >>> including PROV-Dictionary, or if they wish to have only [PROV-O] terms, >>> they can import <http://www.w3.org/ns/prov-o#>. Similarly, < >>> http://www.w3.org/ns/prov-dictionary#> holds only the PROV-Dictionary >>> terms. The owl-file of PROV-Dictionary is available for download here<http://dvcs.w3.org/hg/prov/file/tip/dictionary/prov-dictionary.owl>. >>> (Note that this file is unfinished at the time of this working draft, and >>> may be subject to change.) >> >> >> Is this text acceptable to you? >> >> >>> >>> > prov:qualifiedInsertion >>> > If this Dictionary prov:derivedByInsertionFrom another Dictionary :e, >>> then it can qualify how it did perform the Insertion using >>> prov:qualifiedInsertion [ a prov:Insertion; prov:dictionary :e; >>> prov:inserted [a prov:KeyValuePair; prov:key "k1"^^xsd:string; prov:value >>> :foo] ]. >>> >>> 36) I know I probably wrote this text - but without any indentation it >>> is very difficult to read. Could this be simplified to some kind of >>> mirror of prov:derivedByInsertionFrom? Same for prov:qualifiedRemoval. >>> >>> >>> Done. >> >> >>> 37) example for qualifiedInsertion should not detail the members of >>> our-old-baseball-team-field-positions as that is confusing and makes >>> example large. >>> >>> Done. >> >>> >>> > 5. XML Schema Dictionary >>> > In this section, we provide the XML Schema to use dictionaries with >>> the [PROV-XML] serialization. >>> >>> Ironically, you don't (only fragments) - where can I find and download >>> the XML Schema? >>> >> >> We've included the link. XSD schema will actually be there today. Again, >> we point to the editors space, to allow corrections after publication of >> the document. >> >>> >>> Note that I have not checked the syntax of XSD statements in this >>> section - if I had the schema file I could have validated it. >>> >>> >>> We will validate the schema >> >> >>> 38) Modify to "This section details how to describe dictionaries with >>> the [PROV-XML] serialization". >>> >>> >>> Done. >> >>> 39) Provide download link for XML schema - also include usage >>> instructions as per imports etc. (equivalent as for OWL imports above) >>> >>> >>> Done. >> >> >>> 40) Rename section to "PROV-XML representation of Dictionary" - >>> similarly section 4 from "Ontological Definition of Dictionary" to >>> "PROV-O representation of Dictionary" >>> >>> >>> done. >> >> >>> > 5.2 Key-Value Pair >>> > <xs:element name="key" type="xs:String" /> >>> >>> 41) The specification earlier specifies key as any value/literal - so >>> xs:string (lowercase S!) is too specific - it would not allow >>> integers, for instance. Change to xs:anySimpleType here and in 5.5 >>> Removal >>> > <xs:element name="key" type="xs:String" maxOccurs="unbounded" /> >>> >>> Done. >> >>> >>> >>> > members of a dictionary are specified by listing all the key-value >>> pairs inside a prov:DictionaryMembership element >>> >>> 42) Remove "all the" -- according to semantics of hadDictionaryMember >>> >>> >>> Done. >> >> >>> > 6. Constraints Associated with Dictionary >>> >>> This section is very solid, good work! >>> >>> >>> > These inferences and constraints need to be applied to obtain valid >>> provenance when using dictionaries. >>> >>> 43) I don't think they *need to* be applied? Rephrase to "MAY be >>> applied in order to ensure valid provenance". >>> >>> I think a similar kind of disclaimer as in >>> http://www.w3.org/TR/prov-constraints/#purpose (or just linking to >>> this) could be useful, so that it's clear that these constraints are >>> not a MUST to use dictionaries. >>> >>> Changed, and added reference to purpose section of constraints. >> >>> >>> > Inference 1 (dictionary-membership-collection-membership) >>> > IF hadDictionaryMember(d, e1, "k1") THEN hadMember(d, e1) >>> >>> >>> 44) I would also add the inverse inference >>> dictionary-all-members-have-keys: >>> >>> > Inference X (dictionary-all-members-have-keys) >>> > >>> > Here k is a (potentially unknown) key >>> > >>> > IF hadMember(d, e1) AND 'prov:Dictionary' ∈ typeOf(d) >>> > THEN hadDictionaryMember(d, e1, k) >>> >>> >>> >>> If we don't specify this, opens for a prov:Dictionary to also contain >>> entities which don't have a key. This could be confusing. For instance >>> this would be valid: >>> >>> entity(d0, [prov:type='prov:EmptyDictionary']) >>> entity(d1, [prov:type='prov:Dictionary']) >>> entity(d2, [prov:type='prov:Dictionary']) >>> >>> derivedByInsertionFrom(d1, d0, {("k1", e1)}) >>> // implied insertion-membership >>> //hadDictionaryMember(d1, e1, "k1") >>> // implied by dictionary-membership-collection-membership: >>> //hadMember(d1, e1) >>> >>> derivedByRemovalFrom(d2, d1, {"k1"}) >>> // Invalid by impossible-removal-membership: >>> //hadDictionaryMember(d2, e1, "k1") >>> >>> // however this is still valid .. >>> hadMember(d2, e1) >>> >>> // Unless we add: >>> entity(d2, [prov:type='prov:EmptyDictionary']) >>> // which implies >>> //entity(d2, [prov:type='prov:EmptyCollection']) >>> //which is invalid by constraint membership-empty-collection in >>> PROV-CONSTRAINTS >>> >>> // However, we might now still add this confusing statement: >>> hadMember(d1, e2) >>> >>> // By the PROV-DICTIONARY constraints (including the completeness >>> constraint impossible-insertion-insertion and >>> membership-insertion-membership) we would not here expect any other >>> keys than "k1" in d1 - so we SHOULD be able to conclude that e2==e1 - >>> however we can't do that unless we introduce my inference >>> dictionary-all-members-have-keys: >>> // dictionary-all-members-have-keys implies >>> //hadDictionaryMember(d1, e2, k) >>> // and by key-single-entity and membership-insertion-membership and >>> membership-empty-collection: >>> //e2 == e1 >>> >>> >> You make a valid point, and I think it needs to be discussed before we >> add it. See response at the beginning of this email. >> Since this is not a blocker, we will discuss it for the next WD. >> >> >>> > IF hadDictionaryMember(d1, e, "k") and derivedByInsertionFrom(d2, d1, >>> {("k1", e1),...,("kn", en)}) and k ∉ {k1,...,kn} THEN >>> hadDictionaryMember(d2, e, "k") >>> >>> 45) Don't remove the quotes: "k" ∉ {"k1",...,"kn"} >>> >>> Done. >> >>> >>> > IF derivedByRemovalFrom(d2, d1, {"k1",...,"kn"}) and >>> derivedByInsertionFrom(d2, d1, {("k1", e1),...,("km",em)})THEN INVALID >>> >>> 46) This implies that "k1", etc. needs to be on both sides (Implying >>> an intersection/containment of keys). This constraint is true no >>> matter the key/value pairs, so change to same style as below: >>> >>> > Here, KV1 and KV2 are sets of key-entity pairs. >>> > IF derivedByRemovalFrom(d2, d1, KV1) and derivedByInsertionFrom(d2, >>> d1, KV2) THEN INVALID >>> >>> Done. >> >>> >>> >>> > 6.3 Typing >>> >>> > IF entity(d, [prov:type='prov:Dictionary']) THEN 'prov:Dictionary' ∈ >>> typeOf(d) and 'prov:Collection' ∈ typeOf(d) >>> > IF entity(d, [prov:type='prov:EmptyDictionary']) THEN >>> 'prov:EmptyDictionary' ∈ typeOf(d) and 'prov:Dictionary' ∈ typeOf(d) >>> >>> 47) The second rule would not cause firing of the first rule, so >>> expand the second rule. Also include prov:EmptyCollection and entity. >>> >>> > IF entity(d, [prov:type='prov:EmptyDictionary']) THEN >>> 'prov:EmptyDictionary' ∈ typeOf(d) and 'prov:Dictionary' ∈ typeOf(d) and >>> 'prov:Collection' ∈ typeOf(d) and 'prov:EmptyCollection' ∈ typeOf(d) >>> >>> Done. >> >>> >>> 48) Both lines must also include: >>> 'entity' ∈ typeOf(c) >>> >>> ..as PROV-Constraint "typing" would not fire from a typeof >>> prov:Collection. >>> >>> >>> Done. >> >> >>> >>> > IF hadDictionaryMember(d, e, "k") THEN 'prov:Dictionary' ∈ typeOf(d) >>> and 'entity' ∈ typeOf(e) >>> > IF derivedByInsertionFrom(d2, d1, {("k1", e1)}) THEN 'prov:Dictionary' >>> ∈ typeOf(d1) and 'prov:Dictionary' ∈ typeOf(d2) and 'entity' ∈ typeOf(e1) >>> > IF derivedByRemovalFrom(d2, d1, {"k1"}) THEN 'prov:Dictionary' ∈ >>> typeOf(d1) and 'prov:Dictionary' ∈ typeOf(d2) >>> >>> 49) Similarly all of these should also include >>> > AND prov:Collection' ∈ typeOf(c) AND 'entity' ∈ typeOf(c) >>> >>> Done. >> >>> >>> ==== END OF REVIEW === >>> >>> Now relax..! :) >>> >>> >> I'll try. Is this a blocking issue? ;) >> > > > > The University of Edinburgh is a charitable body, registered in > Scotland, with registration number SC005336. > >
Received on Tuesday, 29 January 2013 14:18:56 UTC