Docs / Knowledge Base / IEML × RDF × Situation Monitor — one graph for meaning, sources, and time
Knowledge Base
Contents
- At a glance
- Online references (live)
- Offline snapshots (link-rot shield)
- 1. RDF tagging, stated precisely
- 2. RDF 1.1 vs RDF 1.2
- 3. IEML → RDF mapping
- 4. The mother example
- 5. SM content on the same graph
- 5.1 Argument map
- 5.2 Concept graph (summary_concepts)
- 5.3 Grammar
- 5.4 Word-identity map
- 5.5 Briefs and sources
- 6. Edge metadata: reifiers first
- 7. A propositional-logic view
- 8. SHACL and OWL 2 RL as a validation layer for LLM output
- 9. Real query outputs
- 10. Graph databases: Oxigraph, the Neo4j lab, and a hybrid
- 11. Tooling caveats (probed, out/tooling-matrix.json)
- 12. Honest limits
- 13. Reproduce
- References
IEML × RDF × Situation Monitor — one graph for meaning, sources, and time
Part: Engineering · Chapter: IEML × RDF × Situation Monitor · Edition: 2026-10-07
Keywords: RDF 1.2, triple term, reifier, language tag, base direction, JSON-LD 1.1, SKOS, OntoLex, PROV-O, SHACL, OWL 2 RL, IEML nine roles, Oxigraph, Neo4j, GQL
Glossary:language-tagged literal,base direction,rdf:type,SKOS,OntoLex,SHACL shape,triple term,OWL 2 RL closure— see GLOSSARY
At a glance
- A nine-role IEML phrase, an RDF labelling scheme, and real Situation Monitor (SM) data load into one RDF 1.2 graph. The SM data: the argument map, a live brief with its sources, the concept graph, grammar frames, and the word-identity map. The prototype lives in
research/rdf/and was run on 2026-10-07. - Edge metadata (sources, rule, clock, valid time, recorded time) lives on RDF 1.2 reifiers. For comparison the same edge is also written as RDF 1.1 reification and as an n-ary node, and all three answer one query identically. Graphiti’s bi-temporal fields and Neo4j relationship properties map one-to-one.
- SHACL and OWL 2 RL work as a deterministic check on LLM output. On the live Economics & Markets brief, the grounding shape flags the same two names the Python grounder flags (DraftKings, Uruguay). A stricter query also catches a name that the Python grounder accepts through a loose anchor. The checks constrain and flag. They do not make a model truthful.
- Tooling is the bottleneck. pyoxigraph 0.5.11 reads and queries RDF 1.2. rdflib 7.6, and therefore pyshacl and owlrl, cannot parse it, so validation runs on an RDF 1.1 projection. The RDF 1.2 specs are still Candidate Recommendation or Working Draft.
Online references (live)
Verified 2026-10-07. Status and date are as printed on each page.
- RDF 1.2 Concepts and Abstract Data Model — W3C Candidate Recommendation Snapshot, 7 April 2026.
- RDF 1.2 Turtle — W3C Working Draft, 14 September 2026.
- RDF 1.2 Interoperability — W3C Group Note Draft, 23 July 2026.
- What’s New in RDF 1.2 — W3C Group Note Draft, 14 July 2026 (W3C news item).
- SPARQL 1.2 Query Language — W3C Working Draft, 4 October 2026 (
LANGDIR,hasLANGDIR,TRIPLE,isTRIPLE). - JSON-LD 1.1 and JSON-LD 1.1 Processing Algorithms and API — W3C Recommendations, 16 July 2020.
- Shapes Constraint Language (SHACL) — W3C Recommendation, 20 July 2017. SHACL 1.2 Core — W3C Working Draft, 18 September 2026.
- OWL 2 Web Ontology Language Profiles (Second Edition) — W3C Recommendation, 11 December 2012. Section 4 is OWL 2 RL.
- SKOS Simple Knowledge Organization System Reference — W3C Recommendation, 18 August 2009.
- PROV-O: The PROV Ontology — W3C Recommendation, 30 April 2013.
- Lexicon Model for Ontologies (OntoLex-Lemon) — W3C Final Community Group Report, 10 May 2016.
- Terrenzi & Ayvaz, Faithful or Findable? Evaluating LLM-Generated Metadata for RDF Dataset Search — arXiv:2607.05970v1.
- ISO/IEC 39075:2024 — GQL — published 2024-04. Spanner Graph and ISO standards.
- Oxigraph (CHANGELOG).
Offline snapshots (link-rot shield)
No snapshot images for this chapter yet. The prototype’s research/rdf/data/live/ keeps the API responses it was built from.
This chapter reports a trial. Keyne supplied two inputs: an IEML-style @node for one English sentence, and a short note on RDF tagging (language tags, base direction, rdf:type, rdfs:label). The question was whether those two inputs and SM’s own content can share one graph, and what that graph buys. The code, data snapshots, and outputs are in the SM repository under research/rdf/. The design consequences are recorded in docs/CONCEPTS_GOVERNANCE.md, § “RDF trial (2026-10-07)”. Every number below comes from that run.
1. RDF tagging, stated precisely
Definition (
rdf:type). The property that says a resource is an instance of a class:ex:the-mother rdf:type schema:Person, writtenain Turtle.
Definition (rdfs:label). A human-readable name for a resource. It has no logical force; a label in a second language is just a second triple.
Language-tagged literal. A string paired with a BCP 47 language tag: "a mãe conta uma história"@pt-BR. The tag “MUST be treated … in a case-insensitive manner” (RDF 1.2 Concepts §3.4). Oxigraph stores tags lower-cased, so pt-BR comes back as pt-br, and the JSON-LD output carries "@language": "pt-br".
Base direction. RDF 1.2 adds a directional language-tagged string (datatype rdf:dirLangString). Its base direction is ltr or rtl. It tells a renderer the initial text direction, so a right-to-left title displays correctly even when it starts with a digit or a Latin acronym.
he^rtl
- Correct form
"שלום"@he--rtl(Turtle);{"@value": "שלום", "@language": "he", "@direction": "rtl"}(JSON-LD 1.1)- Where defined
- RDF 1.2 Turtle; JSON-LD 1.1 §4.2.4.1
^ as a tag separator
- Correct form
^^is the datatype marker ("3"^^xsd:integer). Language uses@, direction uses--- Where defined
- RDF 1.2 Turtle
Direction as part of the language
- Correct form
- Direction is a separate component of the literal.
arstays the language - Where defined
- RDF 1.2 Concepts §3.4
—
- Correct form
- RDF 1.1 cannot store direction. JSON-LD 1.1’s
toRdftherefore has anrdfDirectionoption (i18n-datatypeorcompound-literal) to smuggle it through - Where defined
- JSON-LD 1.1 API
A language tag is a claim, not a check. Query Q2c (§9) compares each tag with the script of its text. It flags four live titles on the geopolitics brief served 2026-10-07: the id (Indonesian) title is Chinese (🌍 全球局势更新), and the hi, th, and uk titles are English. SHACL’s sh:languageIn and sh:uniqueLang cannot see this. They check the tag, not the text.
2. RDF 1.1 vs RDF 1.2
Checked against the RDF 1.2 Concepts CR, the RDF 1.2 Turtle WD, the Interoperability note draft, and SPARQL 1.2 Query WD.
Statements about statements
- RDF 1.1 (Recommendation, 2014)
rdf:Statementwithrdf:subject,rdf:predicate,rdf:object. The statement node does not assert the triple- RDF 1.2 (CR / WD, 2026)
- Triple term
<<( s p o )>>, allowed only in object position. A triple term “denotes a proposition” and is not asserted
Who carries the metadata
- RDF 1.1 (Recommendation, 2014)
- The
rdf:Statementnode - RDF 1.2 (CR / WD, 2026)
- A reifier: subject of
rdf:reifies <<( s p o )>>. Several reifiers can point at one proposition, for example two sources
Turtle sugar
- RDF 1.1 (Recommendation, 2014)
- —
- RDF 1.2 (CR / WD, 2026)
<< s p o ~ r >>(reified triple) and `s p o ~ r {\
… \
- RDF 1.1 (Recommendation, 2014)
- }` (annotation: asserts the triple and reifies it)
- RDF 1.2 (CR / WD, 2026)
- Text direction
none
- RDF 1.1 (Recommendation, 2014)
"…"@ar--rtl, datatyperdf:dirLangString- RDF 1.2 (CR / WD, 2026)
- Version signalling
none
- RDF 1.1 (Recommendation, 2014)
VERSION "1.2"in Turtle; media-type parameterversion=1.2; labels"1.2","1.2-basic","1.1"- RDF 1.2 (CR / WD, 2026)
- Conformance
one level
- RDF 1.1 (Recommendation, 2014)
- Full (triple terms allowed) and Basic (no triple terms)
- RDF 1.2 (CR / WD, 2026)
- SPARQL
- Topic
- WD:
LANGDIR,hasLANGDIR,STRLANGDIR,TRIPLE,SUBJECT/PREDICATE/OBJECT,isTRIPLE - RDF 1.1 (Recommendation, 2014)
- Moving data down
- RDF 1.2 (CR / WD, 2026)
- —
- Topic
- Interoperability note: a basic encoding of triple terms as
rdf:PropositionFormnodes. It preserves information, not semantics - RDF 1.1 (Recommendation, 2014)
- Earlier “RDF-star”
- RDF 1.2 (CR / WD, 2026)
- Community Group report, not a standard
- Topic
- Replaced.
<< >>now means a reifier, not a quoted triple in subject position. Oxigraph removed RDF-star support when it added RDF 1.2 - RDF 1.1 (Recommendation, 2014)
- Shapes
- RDF 1.2 (CR / WD, 2026)
- SHACL 1.0 (2017) knows nothing of reifiers
SHACL 1.2 Core WD adds sh:reifierShape and sh:reificationRequired
3. IEML → RDF mapping
Vocabulary: research/rdf/vocab/sm.ttl (namespace https://situationmonitor.info/ns#, 654 triples). It reuses SKOS, PROV-O, DC Terms, schema.org, OntoLex-Lemon, and LexInfo 3.0. Every class and property has labels in en, pt-BR, es, and ar--rtl.
@node (phrase)
- RDF
sm:Node, a subclass ofsm:Phrase- In the mother example
ex:node a sm:Node
The nine roles
- RDF
- Nine sub-properties of
sm:hasRole(sm:root,sm:initiator,sm:interactant,sm:recipient,sm:causality,sm:time,sm:place,sm:intention,sm:manner). Each hassm:roleIndex0–8 and its Grammar v.1 string - In the mother example
ex:node sm:place ex:place
Role filler
- RDF
sm:RoleFiller(range ofsm:hasRole)- In the mother example
ex:place a sm:RoleFiller
# lexeme
- RDF
sm:lexeme→ontolex:LexicalEntry. The entry’s IRI follows SM’s occurrence id `lang\- In the mother example
- UPOS\
lemma, so live grammar data merges on load |lex:en-NOUN-house|~` inflection
- IEML element
sm:inflection→ ansm:Inflectionindividual with its UD feature andskos:closeMatchto LexInfo. Order is kept insm:inflectionOrder- RDF
sm:infl-definite(Definite=Def)- In the mother example
*case / relation
sm:case (functional) → an sm:CaseMarker individual
- RDF
sm:case-in,sm:case-instrument(closeMatchlexinfo:instrumentalCase)- In the mother example
&and [ … ]junction
sm:Junction with sm:junctionKind sm:and and sm:members as an rdf:List (ordered)
- RDF
ex:manner- In the mother example
- Referent of a filler
sm:denotes → a world entity. SHACL requires the initiator’s referent to be agentive
- RDF
ex:the-mother a schema:Person- In the mother example
- Descriptors (translations)
- IEML element
- Language-tagged
skos:prefLabelon theskos:Conceptreached byontolex:sense/ontolex:reference - RDF
"contar"@pt-BR- In the mother example
- Source text
sm:iemlSource, verbatim
- RDF
- the whole
@nodeblock - In the mother example
- Semantic accent
!, nested phrase in a leaf, USL, dictionary paradigms
Not modelled. Keyne’s example has no accent mark, no nesting, and no USL
- RDF
- —
4. The mother example
research/rdf/examples/mother.ttl has 241 triples. Excerpt:
VERSION "1.2"
PREFIX sm: <https://situationmonitor.info/ns#>
PREFIX ex: <https://situationmonitor.info/id/example/mother/>
PREFIX lex: <https://situationmonitor.info/id/lex/>
ex:node a sm:Node ;
rdfs:label "the mother tells a story"@en , "a mãe conta uma história"@pt-BR ,
"la madre cuenta una historia"@es , "الأم تحكي قصة"@ar--rtl ;
sm:root ex:root ; sm:initiator ex:initiator ; sm:interactant ex:interactant ;
sm:recipient ex:recipient ; sm:causality ex:causality ; sm:time ex:time ;
sm:place ex:place ; sm:intention ex:intention ; sm:manner ex:manner .
ex:root a sm:RoleFiller ; sm:inflection sm:infl-indicative , sm:infl-present ;
sm:inflectionOrder "~indicative mood ~present" ; sm:lexeme lex:en-VERB-tell .
ex:initiator a sm:RoleFiller ; sm:inflection sm:infl-definite ; sm:lexeme lex:en-NOUN-mother ;
sm:denotes ex:the-mother .
ex:recipient a sm:RoleFiller ; sm:inflection sm:infl-possessive-3sg , sm:infl-feminine ;
sm:lexeme lex:en-NOUN-child ; sm:denotes ex:the-child .
ex:causality a sm:RoleFiller ; sm:case sm:case-instrument ; sm:inflection sm:infl-indefinite ;
sm:lexeme lex:en-NOUN-book .
ex:manner a sm:Junction ; sm:case sm:case-with ; sm:junctionKind sm:and ;
sm:members ( ex:manner-1 ex:manner-2 ) .
lex:en-VERB-tell a ontolex:LexicalEntry ; sm:occurrenceId "en|VERB|tell" ;
lexinfo:partOfSpeech lexinfo:verb ; ontolex:canonicalForm lex:en-VERB-tell-form ;
ontolex:sense ex:sense-tell .
ex:sense-tell a ontolex:LexicalSense ; ontolex:reference ex:concept-tell .
ex:concept-tell a skos:Concept ;
skos:prefLabel "tell"@en , "contar"@pt-BR , "contar"@es , "يحكي"@ar--rtl .
The same graph in JSON-LD 1.1 (examples/mother.jsonld) keeps direction as @direction:
{"@language": "ar", "@direction": "rtl", "@value": "الأم تحكي قصة"}
Round trip: Turtle → JSON-LD → Turtle in pyoxigraph is isomorphic, 241 triples, all 15 rtl literals kept. Two tools lose direction without an error:
- rdflib parses the JSON-LD but drops
@direction; - PyLD 3.3 drops it when compacting into a
@container: @languagemap, so the context avoids language maps.
Notes on the source text:
- Keyne’s
joyfullis kept verbatim insm:iemlSource. The lexeme isjoyful laughter, anontolex:MultiwordExpression. - The IEML has a second manner member,
cuddle, that the English sentence does not contain. - The pt-BR (“a criança dela”) and Arabic (“لطفلها”) renderings keep the feminine possessor of
~her ~feminine. Spanish “su hijo” cannot. - These translations were drafted for the prototype and need a native speaker to review them.
5. SM content on the same graph
scripts/export_sm.py reads only real inputs and writes out/sm-export.ttl: 2,699 RDF 1.2 triples, 134 of them reifier → triple-term links. The inputs are the repo’s agents/argument-map/map.json, GET snapshots of the public API from 2026-10-07 05:42 UTC (02:42 BRT), and SM’s own backend functions.
5.1 Argument map
map.json gives 18 nodes, 21 edges, and 6 sources.
- Node kinds become
sm:Claim,sm:Scenario,sm:Evidence,sm:Opposition,sm:Warrant,sm:Rebuttal. All are subclasses ofsm:ArgumentNodeand ofsm:Proposition⊑prov:Entity. - Relations become
sm:supports,sm:opposes,sm:expands,sm:scenarioOf,sm:partOf, …. - Each edge is asserted and reified as an
sm:AssertedEdge. The reifier carries rulesave_map, the certified clock, the map’supdated_at(2026-07-15 18:05 UTC) as recorded time, andprov:wasAttributedTothe map’supdated_by(seed-ltring).
The map’s own role strings (root, initiator, process, destination, time, location, manner, instrument, cause) are not Grammar v.1’s nine roles. They become a SKOS scheme with explicit matches (Q4):
| map role | match | IEML role | nodes |
|---|---|---|---|
| instrument | closeMatch | causality | 4 |
| root | exactMatch | root | 4 |
| initiator | exactMatch | initiator | 3 |
| process | — (no match) | — | 3 |
| destination | closeMatch | recipient | 2 |
| manner | exactMatch | manner | 1 |
| cause | exactMatch | causality | 1 |
5.2 Concept graph (summary_concepts)
From /api/category-summary/Economics & Markets/concepts (43 nodes, 63 edges):
- Keywords become
sm:Keyword, plussm:EvidenceKeywordwhen the node has a source url andsm:ClaimKeywordwhen it does not. - Each edge is asserted and reified as an
sm:DerivedEdgewith its rule:ranked_part_of36,note_group15,_clause12. The reifier also carries the opinion clock, the brief’sgenerated_atas valid time, and the fetch time as recorded time.
Findings:
- Provenance. Only 2 of 63 edges get a source article, and only by intersecting their endpoints’ urls. The payload carries no source ids on edges. This is steal-list item 8 seen in live data.
- Dangling edges. 15 edges point at nodes missing from
nodes[]. The exporter adds 6 stub nodes and counts them. - The url join works. All 32 concept source urls joined to a brief article
_idin this sample. That answers the open question “is the headline url stable enough?” for one brief.
5.3 Grammar
- POS and lexemes. UD UPOS becomes a 17-concept SKOS scheme,
skos:closeMatchto LexInfo parts of speech. Occurrence ids becomeontolex:LexicalEntryIRIs (en|VERB|tell→lex:en-VERB-tell). - Frames. A frame from
grammar_index.frames_from_tokensbecomes ansm:GrammarFramewhose roles come from SM’srole_of(nsubj → initiator, obj → interactant, iobj → recipient, …). Stanza FEATS becomesm:Inflections. - Live frames are partial.
/api/ieml/occurrences/{id}returns only the roles that one occurrence fills, and no write time. The 45 live frames (fortell,ukraine,mother) are thereforesm:GrammarFrameView, deliberately notsm:Phrase. - Re-parse on the box. The Mac grammar server was down, so two sentences were re-parsed on the box with Stanza through SM’s own
tokens_from_docandframes_from_tokens.
Q4c, the same English sentence through both lenses:
| # | role | Keyne’s IEML node | SM role_of (Stanza) |
|---|---|---|---|
| 0 | root | tell | tell |
| 1 | initiator | mother | mother |
| 2 | interactant | story | story |
| 3 | recipient | child | — |
| 4 | causality | book | — |
| 5 | time | sleep | — |
| 6 | place | house | — |
| 7 | intention | love | — |
| 8 | manner | joyful laughter & cuddle | — |
Why the parser stops at three roles:
- house is a bare
obl, with no:locsubtype forrole_ofto use. - child is attached to book as
nmod, which is a parse error. - before she falls asleep is an
advcl.
The IEML node is the target annotation. The parser is SM’s current reach.
5.4 Word-identity map
summary_grounding._EQUIV_GROUPS (9 groups) is exported in three parts:
- each group becomes a
skos:Concept(identity/america, …); - each surface form becomes an
ontolex:LexicalEntrywithontolex:denotesthe group; - the folded match strings become
sm:matchForm.
A brief entity that belongs to a group gets skos:exactMatch to it. This is the RDF shape of the tri-state identity map that item 10 proposes. “Ambiguous” would be one form that denotes two groups. Nothing in the current map does that.
5.5 Briefs and sources
The Economics & Markets brief (llm, generated 2026-10-07 04:03 UTC, 91 articles) exposes 24 source headlines. They become sm:SourceArticles keyed by Mongo _id, each with a language-tagged headline and sm:normalizedText.
The brief’s 4 sentences are sm:BriefSentences that prov:wasDerivedFrom all 24 articles; the API does not say which article backs which sentence. Proper names come from summary_grounding.extract_proper_names and are linked with sm:namesEntity.
The geopolitics brief’s title is exported in all 21 served languages; the Arabic one is @ar--rtl.
6. Edge metadata: reifiers first
The decision is RDF 1.2 reifiers for every edge that needs sources, rule, confidence or margin, clock, valid time, or recorded time. The asserted triple is stated as well, which is what annotation syntax means. One real concept edge, investment —hinges→ economic stability, written three ways (examples/edge-metadata.*.ttl):
# RDF 1.2 annotation: asserts the triple and names its reifier (9 triples)
c:kw%3Ainvestment sm:evidenceFor c:kw%3Aeconomic_stability ~ c:edge-614835cab950 {|
a sm:DerivedEdge ; sm:rule "_clause" ; sm:clock sm:OpinionClock ; rdfs:label "hinges"@en ;
prov:wasDerivedFrom article:6ac5d99e4f653fd254705cea ;
sm:validFrom "2026-10-07T04:03:09.31389Z"^^xsd:dateTime ; # valid time
prov:generatedAtTime "2026-10-07T05:42:04Z"^^xsd:dateTime # recorded time
|} .
# RDF 1.1 reification (12 triples): the statement node does not assert, so assert separately
c:kw%3Ainvestment sm:evidenceFor c:kw%3Aeconomic_stability .
c:stmt-614835cab950 a rdf:Statement , sm:DerivedEdge ;
rdf:subject c:kw%3Ainvestment ; rdf:predicate sm:evidenceFor ; rdf:object c:kw%3Aeconomic_stability ;
sm:rule "_clause" ; … same metadata … .
# n-ary relation node (10 triples): the relation is a resource; no direct triple at all
c:rel-614835cab950 a sm:DerivedEdge ;
nary:from c:kw%3Ainvestment ; nary:relation sm:evidenceFor ; nary:to c:kw%3Aeconomic_stability ;
sm:rule "_clause" ; … same metadata … .
Queries Q6a, Q6b, and Q6c return the same row from each encoding: _clause, article 6ac5d99e4f653fd254705cea, valid 2026-10-07 04:03:09 UTC, recorded 05:42:04 UTC.
| RDF 1.2 reifier | RDF 1.1 rdf:Statement | n-ary node | |
|---|---|---|---|
Plain triple queryable as ?s sm:evidenceFor ?o | yes (annotation asserts it) | yes, if asserted separately | no |
| Two sources as two reifiers of one proposition | yes, by design | yes, but nothing ties the two nodes to one proposition | yes, as two relation nodes |
| rdflib / pyshacl / owlrl | no; needs the basic encoding | yes | yes |
| SHACL 1.0 shapes on the metadata | via a SPARQL target, or on the RDF 1.1 projection | yes | yes |
Mapping to Graphiti and to a property graph. scripts/export_cypher.py writes each reifier as a Neo4j relationship. It follows the pattern of agents/graph/scripts/map_to_cypher.py, and its property names follow Graphiti’s EntityEdge:
| Reifier (RDF 1.2) | Graphiti EntityEdge | Neo4j relationship property |
|---|---|---|
sm:validFrom | valid_at | r.valid_at (datetime) |
sm:validUntil | invalid_at | r.invalid_at |
prov:generatedAtTime | created_at | r.created_at |
sm:expiredAt | expired_at | r.expired_at |
prov:wasDerivedFrom | episodes | r.episodes (list of article IRIs) |
sm:rule, sm:clock, sm:certificate | — | r.rule, r.clock, r.certificate |
| reifier IRI | edge uuid | r.id |
| SHACL result | — | r.shacl_ok, r.shacl_issues |
The export has 61 nodes and 84 edges. 61 of the edges carry shacl_ok = false, almost all for missing provenance. An LPG has one property set per relationship. Two reifiers of the same triple, for example two sources with different confidence, become two parallel relationships.
Two clocks. Valid time says when the fact held. Recorded time says when SM knew it. Q5 asks which edges were valid at T and recorded by R:
| T (valid at) | R (recorded by) | certified (save_map) | opinion (_clause / note_group / ranked_part_of) |
| 2026-10-07 04:30 UTC | 2026-10-07 06:00 UTC | 21 | 12 / 15 / 36 |
| 2026-10-07 04:30 UTC | 2026-08-01 00:00 UTC | 21 | 0 (not yet recorded) |
| 2026-10-07 03:00 UTC | 2026-10-07 06:00 UTC | 21 | 0 (brief not yet valid) |
| Grammar-frame edges never appear in Q5, because the occurrences API exposes no write time for them. |
7. A propositional-logic view
RDF 1.2 Concepts says a triple term “denotes a proposition”. That gives a clean reading of SM’s argument map:
- each claim, scenario, or opposition is a proposition;
sm:supportsandsm:opposesare support and attack edges between propositions;- the reifier on an edge records who asserted the support, from which source, on which clock.
Q7, on the live map:
| proposition | kind | supported by | attacked by |
|---|---|---|---|
usl:root.field | Claim | usl:scenario.theory.superorganism | usl:opposition.agent.vs.process |
usl:scenario.rut.ciclo001 | Scenario | usl:path.ltring.doctrine, usl:scenario.pi.fractal | — |
usl:scenario.tevep.method | Scenario | usl:path.ltring.doctrine | — |
What RDF does not give:
- No negation. “Attacked” has no truth-functional meaning, and RDFS/OWL entailment never concludes that a proposition is false.
- Monotonicity. OWL is monotonic: adding an attack cannot remove an entailment.
- No acceptance semantics. Deciding which claims stand, for example a grounded extension in Dung-style abstract argumentation, is a program run over the graph. It is not an inference the graph makes. That program’s output can be written back as reified, clocked edges like any other derived fact.
8. SHACL and OWL 2 RL as a validation layer for LLM output
SM’s briefs and concept graphs are LLM or heuristic output. The trial treats SHACL and OWL 2 RL as a deterministic layer over that output: fixed shapes, a fixed rule table, the same verdict on every run.
Grounding as a SHACL-SPARQL constraint (shapes/sm-shapes.ttl). It uses the same fold as summary_grounding.name_in_text: normalized text, with forms, aliases, and anchors as match strings.
sm:GroundingShape a sh:NodeShape ;
sh:targetClass sm:BriefSentence ;
sh:sparql [ a sh:SPARQLConstraint ; sh:prefixes sm:prefixes ;
sh:message "Sentence names {?entity} but no prov:wasDerivedFrom source mentions it."@en ;
sh:select """SELECT $this ?entity WHERE {
$this sm:namesEntity ?entity .
FILTER NOT EXISTS {
$this prov:wasDerivedFrom ?src . ?src sm:normalizedText ?t .
?entity sm:matchForm ?f . FILTER (CONTAINS(?t, ?f)) } }""" ] .
Results on the live brief plus one LLM-free stub (examples/stub-ungrounded.ttl, a hand-written sentence about an “Atlantis Central Bank” that its one cited article never mentions):
| sentence | entity | SHACL / Q3 | Python name_in_text | strict full-name Q3b |
|---|---|---|---|---|
| s2 | DraftKings | ungrounded | s3 | Uruguay |
| ungrounded | s4 | Los Angeles Mayor Bass | grounded | grounded by 6ac5b8c700cc76971d42d218 |
| ungrounded | stub | Atlantis Central Bank | ungrounded | — |
| ungrounded | The SPARQL and Python verdicts agree exactly. The strict variant adds one finding. “Los Angeles Mayor Bass” is grounded only through the anchor angeles, matched in a headline about Californians reacting to a Trump remark. That is the false-grounding case steal-list item 10 describes. | Full SHACL run. scripts/validate.py runs pyshacl 0.40.1 with RDFS inference over the RDF 1.1 projection. The data does not conform: 172 results. |
DerivedEdgeShape
- severity
- Violation
- count
- 61
- meaning
- derived concept edge with no
prov:wasDerivedFrom
EdgeSignatureShape
- severity
- Violation
- count
- 15
- meaning
evidenceForfrom a keyword with no url (ClaimKeyword) or a dangling node; item 11’s signature table
GroundingShape
- severity
- Violation
- count
- 3
- meaning
- the table above
DerivedEdgeShape
- severity
- Warning
- count
- 50
- meaning
- derived edge with no recorded time (grammar frames)
FrameInitiatorShape
- severity
- Warning
- count
- 22
- meaning
- frame initiator not typed agentive. Frames have no NER typing.
ukraineas initiator is fine, but the shape cannot know that
CertifiedClockShape
- severity
- Warning
- count
- 21
- meaning
- asserted map edge on the certified clock with no certificate id (item 6)
- shape
- The mother node passes: exactly one root, at most one filler per role, its initiator denotes a
schema:Person, and everyprefLabelhas one value per language.
- shape
- OWL 2 RL closure and conservativity (
scripts/conservativity.py, owlrl 7.6.2). The closure of 4,121 triples adds 3,431 entailed triples and puts nothing inowl:Nothing. Each candidate vocabulary change is closed again and compared on four standing queries: agentive entities, phrases, propositions, edge assertions.
A: annotation on sm:Claim
- new entailed triples
- 1
- standing-query growth
- none
- verdict
- conservative
B: sm:DerivedEdge rdfs:subClassOf prov:Entity
- new entailed triples
- 113
- standing-query growth
- none
- verdict
- conservative
C: sm:initiator rdfs:range sm:AgentiveEntity
- new entailed triples
- 23
- standing-query growth
- +23 agentive entities (role fillers such as ukraine, mother, peso)
- verdict
- non-conservative → quarantine
D: sm:hasRole rdfs:domain sm:Phrase
- new entailed triples
- 64
- standing-query growth
- +45 phrases (every partial frame view)
- verdict
- non-conservative → quarantine
- change
- Change D first appeared as a real bug. An early
sm.ttlhad that domain axiom, and pyshacl’s RDFS inference turned all 45 partial frame views into phrases. Each then failed “exactly one root”. It is the silent-policy case from Concepts governance, met in practice: one innocent-looking axiom, zero new asserted triples, many changed answers.
- change
- Honest framing. This layer checks structure, provenance presence, and string-level grounding. It does not check truth. A sentence that faithfully copies a false headline passes. A wrong language tag passes SHACL, and only the separate script query (Q2c) catches it. A shape is only as good as its match strings, as the anchor case shows. The motivation stands anyway. Terrenzi & Ayvaz (arXiv:2607.05970v1) evaluated LLM-generated metadata for about 1,000 ACORDAR 2.0 RDF datasets. The unconstrained rewrite retrieved best but had the lowest faithfulness (supported-claim rate 0.528). A profile-grounded rewrite reached 0.815 and gave the best balance. Constraint on what a generator may say is where faithfulness comes from. SHACL is a cheap, deterministic way to state and audit that constraint after the fact.
9. Real query outputs
All queries are in research/rdf/queries/ and run in pyoxigraph 0.5.11 over 3,625 quads. Full tables are in out/query-results.md.
Q1, claims about an actor with sources. 13 frames have ukraine as initiator. Each role edge has a reifier (rule role_of, certified clock) that points at its article. Sources include TASS (7 frames), The Guardian (2 frames from one article), NY Post, ABC Australia, Al Jazeera, and The Hindu.
Q2, labels per language, with SPARQL 1.2 LANGDIR.
| lang | dir | n |
|---|---|---|
| en | — | 266 |
| pt-br | — | 114 |
| es | — | 99 |
| ar | rtl | 90 |
| und | — | 26 |
| id | — | 9 |
| 17 other tags | — | 1–2 each |
Q2b returns the geopolitics title in four languages, with 🌍 تحديث الحالة العالمية as @ar--rtl. | ||
Q2c, script mismatch. id → Chinese text. hi, th, uk → English text (§1). tr also holds English but is not flagged, because a Latin-script check cannot tell English from Turkish without a language detector. | ||
| Q4b, fillers by role across every phrase. Only the mother node fills recipient, time, place, intention, and manner. Live frames fill root, initiator, and one causality. |
10. Graph databases: Oxigraph, the Neo4j lab, and a hybrid
| Oxigraph (pyoxigraph 0.5.11) | Neo4j lab (agents/graph/) | |
|---|---|---|
| Model | RDF 1.2 datasets (Full conformance: triple terms) | Labelled property graph, properties on relationships |
| Query | SPARQL 1.1 plus SPARQL 1.2 functions used here (LANGDIR, triple-term patterns) | Cypher |
| Edge metadata | reifiers; many per proposition | one property map per relationship |
| Validation and inference | none built in. pyshacl and owlrl run beside it on an RDF 1.1 projection | none for SHACL / OWL in the lab |
| Deployment | embedded library (Rust, Python wheel); no server needed | Community edition on 127.0.0.1:7474/7687. The README forbids it on sm-prod |
| Role in SM today | research only (research/rdf/) | lab only, seeded from map.json |
The hybrid tried here.
- Oxigraph holds the canonical RDF 1.2 graph with labels, directions, and reifiers.
- SHACL and OWL 2 RL validate it, through the RDF 1.1 projection.
export_cypher.pywrites the validated edges to the Neo4j lab, with Graphiti-style temporal properties and ashacl_okflag on each relationship.
The LPG side is then a view that can be rebuilt from the RDF and is never edited directly.
Context, not a recommendation.
- GQL, ISO/IEC 39075:2024, is the ISO property-graph query language.
- Google documents Spanner Graph as based on GQL and on SQL/PGQ (ISO/IEC 9075-16:2023).
- A future SM graph store could sit on either side of the RDF / LPG line. This trial measured neither at scale; the run is 3,625 quads.
11. Tooling caveats (probed, out/tooling-matrix.json)
| feature | pyoxigraph 0.5.11 | rdflib 7.6.0 → pyshacl 0.40.1, owlrl 7.6.2 |
|---|---|---|
VERSION "1.2" | yes | parse error |
"…"@ar--rtl | yes | parse error |
<<( s p o )>> | yes | parse error |
<< s p o ~ r >>, {\ | … \ | } | ||
| yes | parse error | JSON-LD @direction in |
yes (@ar--rtl) | parses, drops direction silently | JSON-LD out with triple terms |
| refuses (“JSON-LD does not support RDF 1.2 yet”) | — | SPARQL LANGDIR() |
| yes | — | What this means in practice: |
- scripts/rdf12_compat.py writes *.rdf11.ttl for the rdflib side. It keeps triple terms through the Interoperability note’s basic encoding (rdf:PropositionForm) and drops direction, counting each drop: 73 in the vocabulary, 15 in the mother example, 1 in the export. | ||
| - The encode → decode round trip is isomorphic for all three files. | ||
- Inferences that owlrl makes about rdf:PropositionForm nodes are inferences about the encoding. They are not RDF 1.2 semantics. | ||
- Oxigraph’s changelog puts RDF 1.2 behind the rdf-12 build feature since 0.5.0-beta.1. The PyPI wheel used here has it enabled. |
12. Honest limits
- Draft specs. RDF 1.2 Concepts is a CR. Turtle, SPARQL 1.2, and SHACL 1.2 are Working Drafts. The Interoperability and What’s New notes are drafts, and the What’s New body is still mostly a stub. Syntax details can change.
- Two toolchains. Validation and inference run on a lossy RDF 1.1 projection. Direction is gone there, and triple terms are encoded.
- Partial data.
/api/orgs(401) and/api/agents/map(403) were not reachable without credentials, so there is no org graph and no live agent map.?lang=arreturned the English brief, and the Spanish brief is partly English.- The brief exposes 24 of its 91 sources and does not say which source backs which sentence.
- Live frames are partial and undated.
- String grounding is not semantic grounding. Anchors make it permissive (s4), and a correct name in a wrong claim passes.
- IEML coverage. No USL, no dictionary paradigms, no semantic accent, no nested phrase. The nine role names follow the Grammar v.1 strings used in SM. Their exact semantics, for example causality vs instrument, are SM’s reading, not an IEML authority’s.
- Translations. The pt-BR, es, and ar labels were written for the prototype and are unreviewed.
- Standing queries. Conservativity is measured on four standing queries chosen by hand. A different query set gives different verdicts.
13. Reproduce
cd research/rdf
./run_all.sh # venv from requirements.txt; rebuilds out/ from data/live/
./run_all.sh --fetch # re-snapshot the public API (GET only)
Nothing in research/rdf/ is imported by the backend. Nothing was added to backend/requirements.txt.
References
W3C and standards:
- RDF 1.2 Concepts and Abstract Data Model, CR Snapshot 2026-04-07 — https://www.w3.org/TR/rdf12-concepts/
- RDF 1.2 Turtle, WD 2026-09-14 — https://www.w3.org/TR/rdf12-turtle/
- RDF 1.2 Interoperability, Group Note Draft 2026-07-23 — https://www.w3.org/TR/rdf12-interop/
- What’s New in RDF 1.2, Group Note Draft 2026-07-14 — https://www.w3.org/TR/rdf12-new/
- SPARQL 1.2 Query Language, WD 2026-10-04 — https://www.w3.org/TR/sparql12-query/
- JSON-LD 1.1, REC 2020-07-16 — https://www.w3.org/TR/json-ld11/ · API — https://www.w3.org/TR/json-ld11-api/
- SHACL, REC 2017-07-20 — https://www.w3.org/TR/shacl/ · SHACL 1.2 Core, WD 2026-09-18 — https://www.w3.org/TR/shacl12-core/
- OWL 2 Profiles (Second Edition), REC 2012-12-11 — https://www.w3.org/TR/owl2-profiles/
- SKOS Reference, REC 2009-08-18 — https://www.w3.org/TR/skos-reference/
- PROV-O, REC 2013-04-30 — https://www.w3.org/TR/prov-o/
- OntoLex-Lemon, Final Community Group Report 2016-05-10 — https://www.w3.org/2016/05/ontolex/
- ISO/IEC 39075:2024 (GQL) — https://www.iso.org/standard/76120.html · Spanner Graph ISO standards — https://cloud.google.com/spanner/docs/graph/iso-standards
IEML (as in IEML):
- Lévy, P. (2023). Semantic computing with IEML. — https://journals.sagepub.com/doi/10.1177/26339137231207634
- INTLEKT — https://intlekt.io/ieml/
- Keyne/ieml-language — https://github.com/Keyne/ieml-language · Keyne/libieml — https://github.com/Keyne/libieml
LLM metadata:
Related in this bible
- IEML — nine-role phrase, dictionary, USL
- Concepts governance — plan, certificate, conservativity, two clocks
- Agent memory and world-model repos — Graphiti bi-temporal edges and episodes
- WWW Platform — RDF / OWL / JSON-LD beside IEML
- Knowledge OS — argument map
- Part indexes: Engineering · Computer science
Trial run 2026-10-07. Outputs: research/rdf/out/.
On this page
- At a glance
- Online references (live)
- Offline snapshots (link-rot shield)
- 1. RDF tagging, stated precisely
- 2. RDF 1.1 vs RDF 1.2
- 3. IEML → RDF mapping
- 4. The mother example
- 5. SM content on the same graph
- 5.1 Argument map
- 5.2 Concept graph (summary_concepts)
- 5.3 Grammar
- 5.4 Word-identity map
- 5.5 Briefs and sources
- 6. Edge metadata: reifiers first
- 7. A propositional-logic view
- 8. SHACL and OWL 2 RL as a validation layer for LLM output
- 9. Real query outputs
- 10. Graph databases: Oxigraph, the Neo4j lab, and a hybrid
- 11. Tooling caveats (probed, out/tooling-matrix.json)
- 12. Honest limits
- 13. Reproduce
- References