From 1f2339bf996e43a9d73ae1bb4e5eb2bf6571fce7 Mon Sep 17 00:00:00 2001 From: Pfister Pascal BIT Date: Thu, 4 Dec 2025 09:11:19 +0100 Subject: [PATCH 1/4] feat: add DataType to dimension value --- .../Services/RawDataServiceTests.cs | 26 +++++++++++++++++++ .../Model/DimensionValue.cs | 2 ++ .../Services/RawDataService.cs | 19 +++++++++++--- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs b/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs index 0063414..5f0870b 100644 --- a/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs +++ b/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs @@ -42,6 +42,10 @@ public void CreateTriples_WithValidInpu_ReturnsTriplesCorrectly() dataRows[0].Values.Add(new DimensionValue { Predicate = "example:hasSomeOtherLangProperty", Object = "this is text", LanguageTag = "de"}); + dataRows[0].Values.Add(new DimensionValue { Predicate = "example:decimalValue", Object = "50.50", LanguageTag = null, DataType = "http://www.w3.org/2001/XMLSchema#decimal" }); + + dataRows[0].Values.Add(new DimensionValue { Predicate = "example:numberValue", Object = "1", DataType = "http://www.w3.org/2001/XMLSchema#integer" }); + dataRows[1].KeyDimensionLinks.Add( new KeyDimensionLink { Predicate = "example:hasProperty", Uri = "example:someOtherValue"}); @@ -93,6 +97,12 @@ public void CreateTriples_WithValidInpu_ReturnsTriplesCorrectly() ValidateTriple(result, "http://example.com/key/1", "http://example.com/hasSomeOtherLangProperty", "this is text", "'normal' values with language tags must be added as triples", langTag: "de"); ValidateTriple(result, "_:shape_blank_hasSomeOtherLangProperty", "http://www.w3.org/ns/shacl#path", "http://example.com/hasSomeOtherLangProperty", "must have shacl path for 'this is text'"); + + ValidateDataTypeTriple(result, "http://example.com/key/1", "http://example.com/decimalValue", "50.50", "'numeric' values must be added as triples with uri", dataType: "http://www.w3.org/2001/XMLSchema#decimal"); + ValidateTriple(result, "_:shape_blank_decimalValue", "http://www.w3.org/ns/shacl#path", "http://example.com/decimalValue", "must have shacl path for '50.50'"); + + ValidateDataTypeTriple(result, "http://example.com/key/1", "http://example.com/numberValue", "1", "'numeric' values must be added as triples with uri", dataType: "http://www.w3.org/2001/XMLSchema#integer"); + ValidateTriple(result, "_:shape_blank_numberValue", "http://www.w3.org/ns/shacl#path", "http://example.com/numberValue", "must have shacl path for '1'"); } private static void ValidateTriple(IEnumerable triples, object s, object p, object o, string failMessage, string? langTag = null) @@ -111,6 +121,22 @@ private static void ValidateTriple(IEnumerable triples, object s, object failMessage); } + private static void ValidateDataTypeTriple(IEnumerable triples, object s, object p, object o, string failMessage, string dataType) + { + Assert.That( + triples.Any + (t => + { + var subjectMatches = MatchNode(t.Subject, s); + var predicateMatches = MatchNode(t.Predicate, p); + var objectMatches = MatchNode(t.Object, o, dataType); + + return subjectMatches && predicateMatches && objectMatches; + } + ), + failMessage); + } + private static bool MatchNode(INode n, object expected, string? langTag = null) { if (n is LiteralNode literal && !string.IsNullOrEmpty(literal.Language)) diff --git a/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs b/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs index 500bdc5..c72d1fa 100644 --- a/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs +++ b/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs @@ -7,5 +7,7 @@ public class DimensionValue public string Object { get; set; } public string LanguageTag { get; set; } + + public string DataType { get; set; } } } diff --git a/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs b/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs index 7cbb3bb..28c076b 100644 --- a/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs +++ b/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs @@ -151,11 +151,22 @@ public IEnumerable CreateTriples( foreach (var dimensionValue in dataRow.Values) { - yield return new Triple( - graph.CreateUriNode(dataRow.KeyUri), - graph.CreateUriNode(dimensionValue.Predicate), - graph.CreateLiteralNode(dimensionValue.Object, dimensionValue.LanguageTag)); + if (string.IsNullOrEmpty(dimensionValue.DataType)) + { + yield return new Triple( + graph.CreateUriNode(dataRow.KeyUri), + graph.CreateUriNode(dimensionValue.Predicate), + graph.CreateLiteralNode(dimensionValue.Object, dimensionValue.LanguageTag)); + } + else + { + var uri = new Uri(dimensionValue.DataType); + yield return new Triple( + graph.CreateUriNode(dataRow.KeyUri), + graph.CreateUriNode(dimensionValue.Predicate), + graph.CreateLiteralNode(dimensionValue.Object, uri)); + } var currentSchema = dimensionValue.Predicate; var colonIndex = currentSchema.IndexOf(':'); From c5ce728c1ff8ad5410116cf3874067012981a63a Mon Sep 17 00:00:00 2001 From: Pfister Pascal BIT Date: Thu, 4 Dec 2025 09:27:29 +0100 Subject: [PATCH 2/4] feat: add DataType to dimension value #BKDO-2097 --- CHANGELOG.md | 3 +++ .../Services/RawDataServiceTests.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38b4e9d..0143756 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Version 2.0.1 +- Introduce DataType to DimensionValue + ## Version 2.0.0 BREAKING CHANGE: multiple renamings - IServiceCollection.AddCubeRawData -> IServiceCollection.AddRawDataService diff --git a/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs b/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs index 5f0870b..ddcac72 100644 --- a/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs +++ b/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs @@ -11,7 +11,7 @@ internal sealed class RawDataServiceTests private readonly RawDataService _cubeRawDataService = new(); [Test] - public void CreateTriples_WithValidInpu_ReturnsTriplesCorrectly() + public void CreateTriples_WithValidInput_ReturnsTriplesCorrectly() { using Graph graph = new(); From 87cd05206c0637c609cbac028a7f6d8135a13a4a Mon Sep 17 00:00:00 2001 From: Pfister Pascal BIT Date: Thu, 4 Dec 2025 09:43:10 +0100 Subject: [PATCH 3/4] feat: rename DataType to DataTypeUri #BKDO-2097 --- .../Services/RawDataServiceTests.cs | 4 ++-- src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs | 2 +- src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs b/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs index ddcac72..986b4e7 100644 --- a/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs +++ b/src/Swiss.FCh.Cube.RawData.Tests/Services/RawDataServiceTests.cs @@ -42,9 +42,9 @@ public void CreateTriples_WithValidInput_ReturnsTriplesCorrectly() dataRows[0].Values.Add(new DimensionValue { Predicate = "example:hasSomeOtherLangProperty", Object = "this is text", LanguageTag = "de"}); - dataRows[0].Values.Add(new DimensionValue { Predicate = "example:decimalValue", Object = "50.50", LanguageTag = null, DataType = "http://www.w3.org/2001/XMLSchema#decimal" }); + dataRows[0].Values.Add(new DimensionValue { Predicate = "example:decimalValue", Object = "50.50", LanguageTag = null, DataTypeUri = "http://www.w3.org/2001/XMLSchema#decimal" }); - dataRows[0].Values.Add(new DimensionValue { Predicate = "example:numberValue", Object = "1", DataType = "http://www.w3.org/2001/XMLSchema#integer" }); + dataRows[0].Values.Add(new DimensionValue { Predicate = "example:numberValue", Object = "1", DataTypeUri = "http://www.w3.org/2001/XMLSchema#integer" }); dataRows[1].KeyDimensionLinks.Add( new KeyDimensionLink { Predicate = "example:hasProperty", Uri = "example:someOtherValue"}); diff --git a/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs b/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs index c72d1fa..b8acd59 100644 --- a/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs +++ b/src/Swiss.FCh.Cube.RawData/Model/DimensionValue.cs @@ -8,6 +8,6 @@ public class DimensionValue public string LanguageTag { get; set; } - public string DataType { get; set; } + public string DataTypeUri { get; set; } } } diff --git a/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs b/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs index 28c076b..5e95d79 100644 --- a/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs +++ b/src/Swiss.FCh.Cube.RawData/Services/RawDataService.cs @@ -151,7 +151,7 @@ public IEnumerable CreateTriples( foreach (var dimensionValue in dataRow.Values) { - if (string.IsNullOrEmpty(dimensionValue.DataType)) + if (string.IsNullOrEmpty(dimensionValue.DataTypeUri)) { yield return new Triple( graph.CreateUriNode(dataRow.KeyUri), @@ -160,7 +160,7 @@ public IEnumerable CreateTriples( } else { - var uri = new Uri(dimensionValue.DataType); + var uri = new Uri(dimensionValue.DataTypeUri); yield return new Triple( graph.CreateUriNode(dataRow.KeyUri), From 6c70391850f25d376c478d277ef3fbf7c76185f9 Mon Sep 17 00:00:00 2001 From: Pfister Pascal BIT Date: Thu, 4 Dec 2025 11:32:57 +0100 Subject: [PATCH 4/4] chore: fix readme text --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1dd80b1..d2f9fa6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This library can be used to create RDF triples in the context of cubes (see: https://cube.link). The library should be used together with fch-cube-dimension. -The latest NuGet package is published at https://www.nuget.org/packages/Swiss.FCh.Cube.Dimension/. +The latest NuGet package is published at https://www.nuget.org/packages/Swiss.FCh.Cube.RawData. Additional information can be found here: https://github.com/swiss/fch-cube @@ -19,5 +19,5 @@ To publish a new version of the NuGet package, proceed as follows. * apply and push your changes * define and describe the new version in ```CHANGELOG.md``` -* push the corresponding label with ```git tag vx.x.x``` and ```git push origin v.x.x.x``` +* push the corresponding label with ```git tag vx.x.x``` and ```git push origin vx.x.x``` * go to GitHub -> Actions -> 'Build and Publish to NuGet.org' and trigger a run while specifying the correct GIT label