feat/orm
Laurin Weger 4 weeks ago
parent 3c004980e0
commit ea6a860c3e
No known key found for this signature in database
GPG Key ID: 9B372BB0B792770F
  1. 147
      sdk/ng-sdk-js/examples/multi-framework-signals/src/ng-mock/wasm-land/objectBuilder/buildObjects.ts
  2. 2
      sdk/ng-sdk-js/examples/multi-framework-signals/src/ng-mock/wasm-land/sparql/buildConstruct.ts
  3. 6
      sdk/ng-sdk-js/examples/multi-framework-signals/src/ng-mock/wasm-land/sparql/buildSparqlConstructFromShape.ts
  4. 26
      sdk/ng-sdk-js/examples/multi-framework-signals/src/ng-mock/wasm-land/sparql/testShape.schema.ts
  5. 19
      sdk/ng-sdk-js/examples/multi-framework-signals/src/shapes/ldo/catShape.schema.ts
  6. 17
      sdk/ng-sdk-js/examples/multi-framework-signals/src/shapes/ldo/personShape.schema.ts
  7. 28
      sdk/ng-sdk-js/examples/multi-framework-signals/src/shapes/ldo/testShape.schema.ts
  8. 2
      sdk/ng-sdk-js/ng-shex-orm/src/schema-converter/converter.ts
  9. 2
      sdk/ng-sdk-js/ng-shex-orm/src/schema-converter/transformers/ShexJSchemaTransformer.ts
  10. 2
      sdk/ng-sdk-js/ng-shex-orm/src/types.ts

@ -0,0 +1,147 @@
import type {
ShapeType,
Shape,
Predicate,
Schema,
} from "@nextgraph-monorepo/ng-shex-orm";
interface Triple {
s: string;
p: string;
o: string;
}
interface TrackedSubject {
shape: Shape;
parentObject?: TrackedSubject;
valid?: boolean;
trackedPredicates: Record<string, TrackedPredicate>;
/** For Sub-objects only */
untracked?: boolean;
}
interface TrackedPredicate {
shape: Predicate;
currentCardinality: number;
childSubjects?: TrackedSubject[];
}
export function buildObjects(shapeType: ShapeType<any>) {
//
}
export function onTriplesRemoved(
trackedSubjects: Record<string, TrackedSubject[]>,
triplesRemoved: string[][],
shapeType: ShapeType<any>
) {
//
}
/**
* Adds new triples to tracked subjects and creates and returns
* new tracked (possibly nested) subjects.
*/
export function onTriplesAdded(
trackedSubjects: Record<string, TrackedSubject[]>,
triplesAdded: Triple[],
schema: Schema,
rootShape?: Shape
): { newTrackedSubjects: Record<string, TrackedSubject[]> } {
// Track for secondary iterations.
const newTrackedSubjectsCreated: Record<string, TrackedSubject[]> = {};
for (const triple of triplesAdded) {
if (!trackedSubjects[triple.s]) {
// If rootShape is not set, we are applying the triples new nested objects
// and we don't create new tracked subjects.
if (!rootShape) continue;
// Check if predicate is in root shape type.
const matchedPredicate = rootShape.predicates.find((p) => triple.p);
if (!matchedPredicate) {
// Nothing to track.
continue;
}
// The triple should be tracked. Create new tracked subject.
const newTrackedSubject: TrackedSubject = {
shape: rootShape,
trackedPredicates: {
[triple.p]: {
shape: matchedPredicate,
currentCardinality: 1,
},
},
};
trackedSubjects[triple.s] = [newTrackedSubject];
} else {
// Add triple to tracked subject(s).
// In the case of nested shapes, the same subject can be tracked
// in multiple shapes.
const trackedSubjectsMatching = trackedSubjects[triple.s];
for (const trackedSubject of trackedSubjectsMatching) {
// Is predicate tracked in this subject's shape?
const matchedPredShape = trackedSubject.shape.predicates.find(
(predShape) => predShape.iri === triple.p
);
if (!matchedPredShape) continue;
// Get or create tracked predicate for tracked shape.
let trackedPredicate =
trackedSubject.trackedPredicates[matchedPredShape?.iri];
if (!trackedSubjects) {
trackedPredicate = {
currentCardinality: 0,
shape: matchedPredShape,
};
}
// Increase cardinality.
trackedPredicate.currentCardinality += 1;
// If predicate shape has nested object, track that too.
if (trackedPredicate.shape.nestedShape) {
const newTrackedObject: TrackedSubject = {
shape: schema[matchedPredShape.nestedShape as string],
trackedPredicates: {},
parentObject: trackedSubject,
};
// Remember for adding to registry and for re-running on nested shapes.
const newTracked = newTrackedSubjectsCreated[triple.o];
if (!newTracked)
newTrackedSubjectsCreated[triple.o] = [
newTrackedObject,
];
newTracked.push(newTrackedObject);
// Link to parent
const childSubjects = trackedPredicate.childSubjects;
if (childSubjects) childSubjects.push(newTrackedObject);
else trackedPredicate.childSubjects = [newTrackedObject];
}
// TODO: Inform tracked subjects about change
}
}
}
// Rerun triples on new tracked subjects created.
// Then merge with parent tracked subjects
const newNestedSubjectsCreated = onTriplesAdded(
newTrackedSubjectsCreated,
triplesAdded,
schema
);
// TODO: Is it correct to do this?
const ret: Record<string, TrackedSubject[]> = {};
for (const subjectIri of Object.keys(newTrackedSubjectsCreated)) {
ret[subjectIri] = [
...newTrackedSubjectsCreated[subjectIri],
...newNestedSubjectsCreated.newTrackedSubjects[subjectIri],
];
}
// Update Valid invalid
return { newTrackedSubjects: ret };
}
// Do we have infinite-loop issues?

@ -73,7 +73,7 @@ function addConstructPattern(
valuesBlocks: string[],
options?: SparqlBuildOptions
) {
const p = `<${pred.predicateUri}>`;
const p = `<${pred.iri}>`;
const objVar = uniqueVar(ctx, pred.readablePredicate);
const triple = `${subjectVar} ${p} ${objTerm} .`;

@ -47,7 +47,7 @@ export const buildConstructQuery = ({
constructStatements.push({
s: `?${subjectVarName}`,
p: `<${pred.predicateUri}>`,
p: `<${pred.iri}>`,
o: `?${shapeVarName}`,
optional: pred.minCardinality < 1,
literals: pred.literalValue,
@ -58,12 +58,12 @@ export const buildConstructQuery = ({
addTriples(schema[pred.nestedShape]);
} else {
const objVarName = getVarNameFor(
shapeId + "__separator__" + pred.predicateUri
shapeId + "__separator__" + pred.iri
);
constructStatements.push({
s: `?${subjectVarName}`,
p: `<${pred.predicateUri}>`,
p: `<${pred.iri}>`,
o: `?${objVarName}`,
optional: pred.minCardinality < 1,
literals: pred.literalValue,

@ -14,7 +14,7 @@ export const testShapeSchema: Schema = {
literalValue: ["TestObject"],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
iri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
readablePredicate: "type",
extra: true,
},
@ -22,28 +22,28 @@ export const testShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/stringValue",
iri: "http://example.org/stringValue",
readablePredicate: "stringValue",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/numValue",
iri: "http://example.org/numValue",
readablePredicate: "numValue",
},
{
type: "boolean",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/boolValue",
iri: "http://example.org/boolValue",
readablePredicate: "boolValue",
},
{
type: "number",
maxCardinality: -1,
minCardinality: 0,
predicateUri: "http://example.org/arrayValue",
iri: "http://example.org/arrayValue",
readablePredicate: "arrayValue",
},
{
@ -52,7 +52,7 @@ export const testShapeSchema: Schema = {
"http://example.org/TestObject||http://example.org/objectValue",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/objectValue",
iri: "http://example.org/objectValue",
readablePredicate: "objectValue",
},
{
@ -61,7 +61,7 @@ export const testShapeSchema: Schema = {
"http://example.org/TestObject||http://example.org/anotherObject",
maxCardinality: -1,
minCardinality: 0,
predicateUri: "http://example.org/anotherObject",
iri: "http://example.org/anotherObject",
readablePredicate: "anotherObject",
},
{
@ -76,7 +76,7 @@ export const testShapeSchema: Schema = {
],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/numOrStr",
iri: "http://example.org/numOrStr",
readablePredicate: "numOrStr",
},
],
@ -88,21 +88,21 @@ export const testShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/nestedString",
iri: "http://example.org/nestedString",
readablePredicate: "nestedString",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/nestedNum",
iri: "http://example.org/nestedNum",
readablePredicate: "nestedNum",
},
{
type: "number",
maxCardinality: -1,
minCardinality: 0,
predicateUri: "http://example.org/nestedArray",
iri: "http://example.org/nestedArray",
readablePredicate: "nestedArray",
},
],
@ -114,14 +114,14 @@ export const testShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/prop1",
iri: "http://example.org/prop1",
readablePredicate: "prop1",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/prop2",
iri: "http://example.org/prop2",
readablePredicate: "prop2",
},
],

@ -14,36 +14,37 @@ export const catShapeSchema: Schema = {
literalValue: ["http://example.org/Cat"],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
iri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
readablePredicate: "type",
},
{
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/name",
iri: "http://example.org/name",
readablePredicate: "name",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/age",
iri: "http://example.org/age",
readablePredicate: "age",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/numberOfHomes",
iri: "http://example.org/numberOfHomes",
readablePredicate: "numberOfHomes",
},
{
type: "nested",
nestedShape: "http://example.org/Cat||http://example.org/address",
nestedShape:
"http://example.org/Cat||http://example.org/address",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/address",
iri: "http://example.org/address",
readablePredicate: "address",
},
],
@ -55,21 +56,21 @@ export const catShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/street",
iri: "http://example.org/street",
readablePredicate: "street",
},
{
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/houseNumber",
iri: "http://example.org/houseNumber",
readablePredicate: "houseNumber",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/floor",
iri: "http://example.org/floor",
readablePredicate: "floor",
},
],

@ -14,36 +14,37 @@ export const personShapeSchema: Schema = {
literalValue: ["http://example.org/Person"],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
iri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
readablePredicate: "type",
},
{
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/name",
iri: "http://example.org/name",
readablePredicate: "name",
},
{
type: "nested",
nestedShape: "http://example.org/Person||http://example.org/address",
nestedShape:
"http://example.org/Person||http://example.org/address",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/address",
iri: "http://example.org/address",
readablePredicate: "address",
},
{
type: "boolean",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/hasChildren",
iri: "http://example.org/hasChildren",
readablePredicate: "hasChildren",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/numberOfHouses",
iri: "http://example.org/numberOfHouses",
readablePredicate: "numberOfHouses",
},
],
@ -55,14 +56,14 @@ export const personShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/street",
iri: "http://example.org/street",
readablePredicate: "street",
},
{
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/houseNumber",
iri: "http://example.org/houseNumber",
readablePredicate: "houseNumber",
},
],

@ -14,7 +14,7 @@ export const testShapeSchema: Schema = {
literalValue: ["http://example.org/TestObject"],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
iri: "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
readablePredicate: "type",
extra: true,
},
@ -22,28 +22,28 @@ export const testShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/stringValue",
iri: "http://example.org/stringValue",
readablePredicate: "stringValue",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/numValue",
iri: "http://example.org/numValue",
readablePredicate: "numValue",
},
{
type: "boolean",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/boolValue",
iri: "http://example.org/boolValue",
readablePredicate: "boolValue",
},
{
type: "number",
maxCardinality: -1,
minCardinality: 0,
predicateUri: "http://example.org/arrayValue",
iri: "http://example.org/arrayValue",
readablePredicate: "arrayValue",
},
{
@ -52,7 +52,7 @@ export const testShapeSchema: Schema = {
"http://example.org/TestObject||http://example.org/objectValue",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/objectValue",
iri: "http://example.org/objectValue",
readablePredicate: "objectValue",
},
{
@ -61,7 +61,7 @@ export const testShapeSchema: Schema = {
"http://example.org/TestObject||http://example.org/anotherObject",
maxCardinality: -1,
minCardinality: 0,
predicateUri: "http://example.org/anotherObject",
iri: "http://example.org/anotherObject",
readablePredicate: "anotherObject",
},
{
@ -76,7 +76,7 @@ export const testShapeSchema: Schema = {
],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/numOrStr",
iri: "http://example.org/numOrStr",
readablePredicate: "numOrStr",
},
{
@ -84,7 +84,7 @@ export const testShapeSchema: Schema = {
literalValue: ["lit1", "lit2"],
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/lit1Or2",
iri: "http://example.org/lit1Or2",
readablePredicate: "lit1Or2",
},
],
@ -96,21 +96,21 @@ export const testShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/nestedString",
iri: "http://example.org/nestedString",
readablePredicate: "nestedString",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/nestedNum",
iri: "http://example.org/nestedNum",
readablePredicate: "nestedNum",
},
{
type: "number",
maxCardinality: -1,
minCardinality: 0,
predicateUri: "http://example.org/nestedArray",
iri: "http://example.org/nestedArray",
readablePredicate: "nestedArray",
},
],
@ -122,14 +122,14 @@ export const testShapeSchema: Schema = {
type: "string",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/prop1",
iri: "http://example.org/prop1",
readablePredicate: "prop1",
},
{
type: "number",
maxCardinality: 1,
minCardinality: 1,
predicateUri: "http://example.org/prop2",
iri: "http://example.org/prop2",
readablePredicate: "prop2",
},
],

@ -84,7 +84,7 @@ function flattenSchema(shapes: Shape[]): ShapeSchema {
);
for (const pred of nestedSchemaPredicates) {
const newId = shape.iri + "||" + pred.predicateUri;
const newId = shape.iri + "||" + pred.iri;
// Recurse
const flattened = flattenSchema([

@ -99,7 +99,7 @@ export const ShexJSchemaTransformerCompact = ShexJTraverser.createTransformer<
for (const extra of _shape.extra || []) {
const extraPredicate = compactShape.predicates.find(
(p) => p.predicateUri === extra
(p) => p.iri === extra
);
if (extraPredicate) extraPredicate.extra = true;
}

@ -25,7 +25,7 @@ export interface Predicate {
/** Type of property. */
type: DataType["type"] | "nested" | "eitherOf";
/** The RDF predicate URI. */
predicateUri: string;
iri: string;
/** The alias of the `predicateUri` when serialized to a JSON object. */
readablePredicate: string;
/** The required literal value(s), if type is `literal`. Others are allowed, if `extra` is true. */

Loading…
Cancel
Save