= 3 non-unique validation comments = - " { [] } on { }" -- 1val1IRIREF.shex == 1val1iri.shex - " { LITERAL PATTERN \"^bc$\" } on { \"^bc$\" }" -- <#1literalPattern_pass-StartlitEnd-match> == <#1literalStartPatternEnd_CarrotbcDollar> - ":S1 {:p1 .|:p2 .,:p3 .} / { :s1 :p1 \"p1-0\"; :p2 \"p2-0\"; :p3 \"p3-0\" . }" -- <#1dotOne2dot-oneOf_fail_p1p2p3> ~<#1dotOne2dot-someOf_fail_p1p2p3> ~sht:EachOf-unvisited ``` c = data["@graph"][0].entries.reduce((acc, t) => { if (t.comment in acc) { acc[t.comment].push(t); } else { acc[t.comment] = [t]; } return acc; }, {}) d = Object.keys(c).filter(k => c[k].length > 1) ``` = What do we do with recursive structures like: = ``` { $ ( &; . ?) } ``` ``` { "@context": "https://shexspec.github.io/context.jsonld", "type": "Schema", "shapes": [ { "id": "http://all.example/S1", "type": "Shape", "expression": { "id": "http://all.example/S1e", "type": "EachOf", "expressions": [ "http://all.example/S1e", { "type": "TripleConstraint", "predicate": "http://all.example/p1", "min": 0, "max": 1 } ] } } ] } ``` ``` BASE PREFIX sx: [] a sx:Schema ; sx:shapes . a sx:Shape ; sx:expression . a sx:EachOf ; sx:expressions ( [ a sx:TripleConstraint ; sx:predicate ; sx:min 0 ; sx:max 1 ] ) . ```