Docs / Knowledge Base / IEML × RDF × Situation Monitor — one graph for meaning, sources, and time

Knowledge Base

Contents

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.

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, written a in 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. ar stays the language
Where defined
RDF 1.2 Concepts §3.4

—

Correct form
RDF 1.1 cannot store direction. JSON-LD 1.1’s toRdf therefore has an rdfDirection option (i18n-datatype or compound-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:Statement with rdf: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:Statement node
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, datatype rdf:dirLangString
RDF 1.2 (CR / WD, 2026)
Version signalling

none

RDF 1.1 (Recommendation, 2014)
VERSION "1.2" in Turtle; media-type parameter version=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:PropositionForm nodes. 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 of sm: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 has sm:roleIndex 0–8 and its Grammar v.1 string
In the mother example
ex:node sm:place ex:place

Role filler

RDF
sm:RoleFiller (range of sm: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 → an sm:Inflection individual with its UD feature and skos:closeMatch to LexInfo. Order is kept in sm: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 (closeMatch lexinfo: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:prefLabel on the skos:Concept reached by ontolex:sense/ontolex:reference
RDF
"contar"@pt-BR
In the mother example
Source text

sm:iemlSource, verbatim

RDF
the whole @node block
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: @language map, so the context avoids language maps.

Notes on the source text:

  • Keyne’s joyfull is kept verbatim in sm:iemlSource. The lexeme is joyful laughter, an ontolex: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

Argument mapBriefs and sources (PROV-O)Lexicon (OntoLex + SKOS)IEML layer (sm:)sm:initiator … sm:mannersm:lexemesm:inflection / sm:caseontolex:sense/referenceontolex:denotes ⁻¹prov:wasDerivedFromsm:namesEntityskos:exactMatchsm:evidenceFor / sm:partOfsm:supports / sm:opposessm:mapRole →skos:closeMatchrdf:reifies «( s p o )»prov:wasDerivedFrom

sm:Node / sm:GrammarFrame

sm:RoleFiller

ontolex:LexicalEntry
lex:en-VERB-tell

sm:Inflection / sm:CaseMarker

skos:Concept
prefLabel @en @pt-BR @es @ar--rtl

identity group
skos:Concept

identity form
LexicalEntry

sm:BriefSentence

sm:SourceArticle
Mongo _id

sm:NamedEntity

sm:Keyword

sm:Keyword

sm:Claim / sm:Scenario …

sm:Claim

reifier
sm:DerivedEdge

Figure 1. IEML layer, lexicon, briefs and sources, and the argument map on one RDF 1.2 graph; the dashed edge is a reifier pointing at a triple term. Scroll sideways on small screens.

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 of sm:ArgumentNode and of sm: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 rule save_map, the certified clock, the map’s updated_at (2026-07-15 18:05 UTC) as recorded time, and prov:wasAttributedTo the map’s updated_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 rolematchIEML rolenodes
instrumentcloseMatchcausality4
rootexactMatchroot4
initiatorexactMatchinitiator3
process— (no match)—3
destinationcloseMatchrecipient2
mannerexactMatchmanner1
causeexactMatchcausality1

5.2 Concept graph (summary_concepts)

From /api/category-summary/Economics & Markets/concepts (43 nodes, 63 edges):

  • Keywords become sm:Keyword, plus sm:EvidenceKeyword when the node has a source url and sm:ClaimKeyword when it does not.
  • Each edge is asserted and reified as an sm:DerivedEdge with its rule: ranked_part_of 36, note_group 15, _clause 12. The reifier also carries the opinion clock, the brief’s generated_at as 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 _id in 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:closeMatch to LexInfo parts of speech. Occurrence ids become ontolex:LexicalEntry IRIs (en|VERB|tell → lex:en-VERB-tell).
  • Frames. A frame from grammar_index.frames_from_tokens becomes an sm:GrammarFrame whose roles come from SM’s role_of (nsubj → initiator, obj → interactant, iobj → recipient, …). Stanza FEATS become sm: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 (for tell, ukraine, mother) are therefore sm:GrammarFrameView, deliberately not sm: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_doc and frames_from_tokens.

Q4c, the same English sentence through both lenses:

#roleKeyne’s IEML nodeSM role_of (Stanza)
0roottelltell
1initiatormothermother
2interactantstorystory
3recipientchild—
4causalitybook—
5timesleep—
6placehouse—
7intentionlove—
8mannerjoyful laughter & cuddle—

Why the parser stops at three roles:

  • house is a bare obl, with no :loc subtype for role_of to 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:LexicalEntry with ontolex:denotes the 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 reifierRDF 1.1 rdf:Statementn-ary node
Plain triple queryable as ?s sm:evidenceFor ?oyes (annotation asserts it)yes, if asserted separatelyno
Two sources as two reifiers of one propositionyes, by designyes, but nothing ties the two nodes to one propositionyes, as two relation nodes
rdflib / pyshacl / owlrlno; needs the basic encodingyesyes
SHACL 1.0 shapes on the metadatavia a SPARQL target, or on the RDF 1.1 projectionyesyes

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 EntityEdgeNeo4j relationship property
sm:validFromvalid_atr.valid_at (datetime)
sm:validUntilinvalid_atr.invalid_at
prov:generatedAtTimecreated_atr.created_at
sm:expiredAtexpired_atr.expired_at
prov:wasDerivedFromepisodesr.episodes (list of article IRIs)
sm:rule, sm:clock, sm:certificate—r.rule, r.clock, r.certificate
reifier IRIedge uuidr.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 UTC2026-10-07 06:00 UTC2112 / 15 / 36
2026-10-07 04:30 UTC2026-08-01 00:00 UTC210 (not yet recorded)
2026-10-07 03:00 UTC2026-10-07 06:00 UTC210 (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:supports and sm:opposes are 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:

propositionkindsupported byattacked by
usl:root.fieldClaimusl:scenario.theory.superorganismusl:opposition.agent.vs.process
usl:scenario.rut.ciclo001Scenariousl:path.ltring.doctrine, usl:scenario.pi.fractal—
usl:scenario.tevep.methodScenariousl: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):

sentenceentitySHACL / Q3Python name_in_textstrict full-name Q3b
s2DraftKingsungroundeds3Uruguay
ungroundeds4Los Angeles Mayor Bassgroundedgrounded by 6ac5b8c700cc76971d42d218
ungroundedstubAtlantis Central Bankungrounded—
ungroundedThe 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
evidenceFor from 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. ukraine as 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 every prefLabel has 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 in owl: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.ttl had 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.

langdirn
en—266
pt-br—114
es—99
arrtl90
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/)
ModelRDF 1.2 datasets (Full conformance: triple terms)Labelled property graph, properties on relationships
QuerySPARQL 1.1 plus SPARQL 1.2 functions used here (LANGDIR, triple-term patterns)Cypher
Edge metadatareifiers; many per propositionone property map per relationship
Validation and inferencenone built in. pyshacl and owlrl run beside it on an RDF 1.1 projectionnone for SHACL / OWL in the lab
Deploymentembedded library (Rust, Python wheel); no server neededCommunity edition on 127.0.0.1:7474/7687. The README forbids it on sm-prod
Role in SM todayresearch only (research/rdf/)lab only, seeded from map.json

The hybrid tried here.

  1. Oxigraph holds the canonical RDF 1.2 graph with labels, directions, and reifiers.
  2. SHACL and OWL 2 RL validate it, through the RDF 1.1 projection.
  3. export_cypher.py writes the validated edges to the Neo4j lab, with Graphiti-style temporal properties and a shacl_ok flag 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)

featurepyoxigraph 0.5.11rdflib 7.6.0 → pyshacl 0.40.1, owlrl 7.6.2
VERSION "1.2"yesparse error
"…"@ar--rtlyesparse error
<<( s p o )>>yesparse error
<< s p o ~ r >>, {\ | … \ | }
yesparse errorJSON-LD @direction in
yes (@ar--rtl)parses, drops direction silentlyJSON-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=ar returned 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


Trial run 2026-10-07. Outputs: research/rdf/out/.

Back to top ↑

All entries Glossary Foundations