Skip to content

Commit ec39153

Browse files
committed
Implements Tinkarization of Event Set Hierarchy
Enables the full ETL process by integrating the `Loader` component. Rewrites the `Loader` class to persist Event Set Hierarchy concepts, descriptions, and 'Is-A' relationships into a Tinkar database using the Composer API. Handles concept creation based on active/inactive status and attaches FQN, synonym, definition, and identifier semantics. Initializes core concepts like "Event Code Identifier" and the ESH Model root. Refines `Database.close()` signature and renames `parentId` to `parentIds` in `NavigableDatum` for clarity.
1 parent a1f0a6c commit ec39153

6 files changed

Lines changed: 87 additions & 103 deletions

File tree

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package dev.ikm.ike.tinkarizer;
22

3+
import dev.ikm.ike.tinkarizer.database.Database;
34
import dev.ikm.ike.tinkarizer.entity.NavigableDatum;
45
import dev.ikm.ike.tinkarizer.entity.NavigableExtract;
56
import dev.ikm.ike.tinkarizer.entity.ViewableDatum;
67
import dev.ikm.ike.tinkarizer.entity.ViewableExtract;
78
import dev.ikm.ike.tinkarizer.etl.Extractor;
9+
import dev.ikm.ike.tinkarizer.etl.Loader;
810
import dev.ikm.ike.tinkarizer.etl.Transformer;
911
import org.slf4j.Logger;
1012
import org.slf4j.LoggerFactory;
@@ -29,42 +31,25 @@ public ESHTinkarizer(String databaseName, File dbPath, File eventSetCSV, File ev
2931
}
3032

3133
public void run() {
32-
// try (Database database = new Database(dbPath, databaseName)) {
34+
try (Database database = new Database(dbPath, databaseName)) {
3335

36+
//Extract
3437
Extractor extractor = new Extractor();
3538
List<ViewableExtract> viewableExtracts = extractor.viewableData(eventSetCSV, eventCodeCSV);
3639
List<NavigableExtract> navigableExtracts = extractor.navigableData(eventSetCSV, eventCodeCSV);
3740

41+
//Transform
3842
Transformer transformer = new Transformer();
3943
List<ViewableDatum> viewableData = transformer.transformViewableExtracts(viewableExtracts);
4044
List<NavigableDatum> navigableData = transformer.transformNavigableExtracts(navigableExtracts);
4145

46+
//Load
47+
try (Loader loader = new Loader(System.currentTimeMillis())) {
48+
loader.loadViewableData(viewableData);
49+
loader.loadNavigableData(navigableData);
50+
}
4251

43-
// try(Loader loader = new Loader(System.currentTimeMillis())) {
44-
// loader.loadViewableData(viewableData);
45-
// loader.loadNavigableData(navigableData);
46-
// }
47-
48-
49-
// try (Loader transformer = new Loader()) {
50-
// try (Extractor extract = new Extractor(eventSetCSV, eventCodeCSV, 50_000)) {
51-
// List<CompletableFuture<Void>> completableFutures = new ArrayList<>();
52-
//
53-
// for (List<ViewableExtract> viewableData : extract.viewableData()) {
54-
// completableFutures.add(CompletableFuture.runAsync(() -> {
55-
// transformer.viewableTransformation(viewableData);
56-
// }));
57-
// }
58-
//
59-
// for (List<NavigableExtract> navigableData : extract.navigableData()) {
60-
// completableFutures.add(CompletableFuture.runAsync(() -> {
61-
// transformer.navigableTransformation(navigableData);
62-
// }));
63-
// }
64-
// CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])).join();
65-
// }
66-
// }
67-
// }
68-
LOG.info("Skipped {} of Event Code to Event Set Is-As", transformer.getSkippedNavigableExtracts().size());
52+
LOG.info("Skipped {} of Event Code to Event Set \"Is-As\" Relationships", transformer.getSkippedNavigableExtracts().size());
53+
}
6954
}
7055
}

src/main/java/dev/ikm/ike/tinkarizer/database/Database.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public Database(File dbPath, String databaseName) {
1919
}
2020

2121
@Override
22-
public void close() throws Exception {
22+
public void close() {
2323
EntityService.get().endLoadPhase();
2424
PrimitiveData.stop();
2525
}

src/main/java/dev/ikm/ike/tinkarizer/entity/NavigableDatum.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55

66
public record NavigableDatum(
77
UUID childId,
8-
List<UUID> parentId) { }
8+
List<UUID> parentIds) { }

src/main/java/dev/ikm/ike/tinkarizer/etl/Extractor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.io.Reader;
1414
import java.util.ArrayList;
1515
import java.util.List;
16+
import java.util.UUID;
1617
import java.util.concurrent.atomic.AtomicReference;
1718
import java.util.stream.Stream;
1819

src/main/java/dev/ikm/ike/tinkarizer/etl/Loader.java

Lines changed: 70 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import dev.ikm.ike.tinkarizer.entity.NavigableDatum;
44
import dev.ikm.ike.tinkarizer.entity.NavigableExtract;
55
import dev.ikm.ike.tinkarizer.entity.ViewableDatum;
6-
import dev.ikm.ike.tinkarizer.entity.ViewableExtract;
76
import dev.ikm.tinkar.common.id.PublicIds;
87
import dev.ikm.tinkar.composer.Composer;
98
import dev.ikm.tinkar.composer.Session;
@@ -14,6 +13,7 @@
1413
import dev.ikm.tinkar.composer.template.StatedAxiom;
1514
import dev.ikm.tinkar.composer.template.Synonym;
1615
import dev.ikm.tinkar.composer.template.USDialect;
16+
import dev.ikm.tinkar.entity.VersionProxy;
1717
import dev.ikm.tinkar.terms.EntityProxy.Concept;
1818
import dev.ikm.tinkar.terms.EntityProxy.Semantic;
1919
import dev.ikm.tinkar.terms.State;
@@ -25,7 +25,7 @@
2525
import java.util.UUID;
2626
import java.util.concurrent.atomic.AtomicInteger;
2727

28-
public class Loader implements AutoCloseable{
28+
public class Loader implements AutoCloseable {
2929

3030
Logger LOG = LoggerFactory.getLogger(Loader.class);
3131

@@ -80,89 +80,85 @@ private void init() {
8080
.caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE)
8181
.attach((USDialect dialect) -> dialect.acceptability(TinkarTermV2.PREFERRED)))
8282
.attach((StatedAxiom stated) -> stated.isA(TinkarTermV2.IDENTIFIER_SOURCE)));
83+
84+
//Attached Root
85+
Concept eshModel = Concept.make(PublicIds.of(UUID.fromString("f0b69a19-ba4f-4e52-b30e-d998f028f0ab")));
86+
Concept esRoot = Concept.make(PublicIds.of(UUID.fromString("47e533f4-a3d8-5d5b-826d-24eb09d1f3ab")));
87+
activeSession.compose(new StatedAxiom()
88+
.isA(eshModel), esRoot);
8389
}
8490

8591
public void loadViewableData(List<ViewableDatum> viewableData) {
92+
viewableData.forEach(data -> {
93+
Concept concept = Concept.make(PublicIds.of(data.ids()));
94+
95+
//Create Concept Active or Inactive
96+
if (data.isActive()) {
97+
activeSession.compose((ConceptAssembler conceptAssembler) ->
98+
conceptAssembler.publicId(concept.publicId()));
99+
conceptCounter.incrementAndGet();
100+
} else {
101+
inactiveSession.compose((ConceptAssembler conceptAssembler) ->
102+
conceptAssembler.publicId(concept.publicId()));
103+
conceptCounter.incrementAndGet();
104+
}
86105

106+
//Create FQN Semantic
107+
Semantic fqn = Semantic.make(PublicIds.newRandom());
108+
activeSession.compose(new FullyQualifiedName()
109+
.semantic(fqn)
110+
.language(TinkarTermV2.ENGLISH_LANGUAGE)
111+
.text(data.fqn())
112+
.caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE), concept);
113+
semanticCounter.incrementAndGet();
114+
activeSession.compose(new USDialect().acceptability(TinkarTermV2.PREFERRED), fqn);
115+
semanticCounter.incrementAndGet();
116+
117+
//Create SYN Semantic
118+
Semantic syn = Semantic.make(PublicIds.newRandom());
119+
activeSession.compose(new Synonym()
120+
.semantic(syn)
121+
.language(TinkarTermV2.ENGLISH_LANGUAGE)
122+
.text(data.syn().isEmpty() ? data.fqn() : data.syn())
123+
.caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE), concept);
124+
semanticCounter.incrementAndGet();
125+
activeSession.compose(new USDialect().acceptability(TinkarTermV2.PREFERRED), syn);
126+
semanticCounter.incrementAndGet();
127+
128+
//Create DEF Semantic
129+
Semantic def = Semantic.make(PublicIds.newRandom());
130+
activeSession.compose(new Definition()
131+
.semantic(def)
132+
.language(TinkarTermV2.ENGLISH_LANGUAGE)
133+
.text(data.def().isEmpty() ? data.fqn() : data.def())
134+
.caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE), concept);
135+
semanticCounter.incrementAndGet();
136+
activeSession.compose(new USDialect().acceptability(TinkarTermV2.PREFERRED), def);
137+
semanticCounter.incrementAndGet();
138+
139+
//Create Identifier Semantic
140+
if (!data.identifier().isEmpty()) {
141+
activeSession.compose(new Identifier().source(EC_IDENTIFIER_CONCEPT).identifier(data.identifier()), concept);
142+
semanticCounter.incrementAndGet();
143+
}
144+
});
145+
LOG.info("Finish transforming {} Viewable Data", viewableData.size());
87146
}
88147

89148
public void loadNavigableData(List<NavigableDatum> navigableData) {
90-
91-
}
92-
93-
public void viewableTransformation(List<ViewableExtract> viewableData) {
94-
//
95-
// for (ViewableExtract data : viewableData) {
96-
// Concept concept = Concept.make(PublicIds.of(data.ids()));
97-
//
98-
// //Create Concept Active or Inactive
99-
// if (data.status()) {
100-
// activeSession.compose((ConceptAssembler conceptAssembler) -> conceptAssembler.publicId(concept.publicId()));
101-
// conceptCounter.incrementAndGet();
102-
// } else {
103-
// inactiveSession.compose((ConceptAssembler conceptAssembler) -> conceptAssembler.publicId(concept.publicId()));
104-
// conceptCounter.incrementAndGet();
105-
// }
106-
//
107-
// //Create FQN Semantic
108-
// Semantic fqn = Semantic.make(PublicIds.newRandom());
109-
// activeSession.compose(new FullyQualifiedName()
110-
// .semantic(fqn)
111-
// .language(TinkarTermV2.ENGLISH_LANGUAGE)
112-
// .text(data.fqn())
113-
// .caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE), concept);
114-
// semanticCounter.incrementAndGet();
115-
// activeSession.compose(new USDialect().acceptability(TinkarTermV2.PREFERRED), fqn);
116-
// semanticCounter.incrementAndGet();
117-
//
118-
// //Create SYN Semantic
119-
// Semantic syn = Semantic.make(PublicIds.newRandom());
120-
// activeSession.compose(new Synonym()
121-
// .semantic(syn)
122-
// .language(TinkarTermV2.ENGLISH_LANGUAGE)
123-
// .text(data.syn().isEmpty() ? data.fqn() : data.syn())
124-
// .caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE), concept);
125-
// semanticCounter.incrementAndGet();
126-
// activeSession.compose(new USDialect().acceptability(TinkarTermV2.PREFERRED), syn);
127-
// semanticCounter.incrementAndGet();
128-
//
129-
// //Create DEF Semantic
130-
// Semantic def = Semantic.make(PublicIds.newRandom());
131-
// activeSession.compose(new Definition()
132-
// .semantic(def)
133-
// .language(TinkarTermV2.ENGLISH_LANGUAGE)
134-
// .text(data.def().isEmpty() ? data.fqn() : data.def())
135-
// .caseSignificance(TinkarTermV2.DESCRIPTION_NOT_CASE_SENSITIVE), concept);
136-
// semanticCounter.incrementAndGet();
137-
// activeSession.compose(new USDialect().acceptability(TinkarTermV2.PREFERRED), def);
138-
// semanticCounter.incrementAndGet();
139-
//
140-
// //Create Identifier Semantic
141-
// if (!data.ids().isEmpty()) {
142-
// activeSession.compose(new Identifier().source(EC_IDENTIFIER_CONCEPT).ids(data.ids()), concept);
143-
// semanticCounter.incrementAndGet();
144-
// }
145-
// }
146-
// LOG.info("Finish transforming {} Viewable Data", viewableData.size());
147-
}
148-
149-
public void navigableTransformation(List<NavigableExtract> navigableData) {
150-
//Need Stated Relationship to tie to main hierarchy
151-
activeSession.compose(new StatedAxiom().isA(ESH_MODEL_CONCEPT), Concept.make(PublicIds.of(UUID.fromString("47e533f4-a3d8-5d5b-826d-24eb09d1f3ab"))));
152-
153-
for (NavigableExtract navData : navigableData) {
154-
Concept reference = Concept.make(PublicIds.of(navData.childId()));
155-
if (navData.parentId() == null) {
156-
System.out.println("break");
157-
}
158-
Concept parent = Concept.make(PublicIds.of(navData.parentId()));
159-
activeSession.compose(new StatedAxiom().isA(parent), reference);
160-
}
149+
navigableData.forEach(data -> {
150+
Concept reference = Concept.make(PublicIds.of(data.childId()));
151+
List<Concept> parentConcepts = data.parentIds().stream()
152+
.map(PublicIds::of)
153+
.map(Concept::make)
154+
.toList();
155+
activeSession.compose(new StatedAxiom().isA(parentConcepts.toArray(new Concept[0])), reference);
156+
});
161157
LOG.info("Finish transforming {} Navigable Data", navigableData.size());
162158
}
163159

164160
@Override
165-
public void close() throws Exception {
161+
public void close() {
166162
composer.commitAllSessions();
167163
}
168164
}

src/main/java/dev/ikm/ike/tinkarizer/etl/Transformer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public List<NavigableDatum> transformNavigableExtracts(List<NavigableExtract> na
7474
}
7575
}
7676
}
77+
//TODO-add in connection to root es concept with tinkar hierarchy
78+
7779

7880
//Transform consolidated ES Navigation data
7981
esIsA.forEach((childId, parentIds) -> navigableData.add(new NavigableDatum(childId, parentIds)));

0 commit comments

Comments
 (0)