From 61fe61795734673cf13c4573b3f09290cab8fce9 Mon Sep 17 00:00:00 2001 From: mdesalvo Date: Wed, 1 Nov 2023 17:58:14 +0100 Subject: [PATCH] Extend capabilities of applying metadata to triples --- RDFSharp.Test/Model/RDFGraphTest.cs | 26 +++++++++++++++++++++++--- RDFSharp.Test/Model/RDFTripleTest.cs | 6 +++--- RDFSharp.Test/RDFSharp.Test.csproj | 4 ++-- RDFSharp/Model/RDFGraph.cs | 4 ++-- RDFSharp/Model/RDFModelEnums.cs | 17 ++++++++++++++++- RDFSharp/Model/RDFTriple.cs | 22 ++++++++++------------ RDFSharp/RDFSharp.csproj | 2 +- 7 files changed, 57 insertions(+), 24 deletions(-) diff --git a/RDFSharp.Test/Model/RDFGraphTest.cs b/RDFSharp.Test/Model/RDFGraphTest.cs index 9a760c15..dc88bc05 100644 --- a/RDFSharp.Test/Model/RDFGraphTest.cs +++ b/RDFSharp.Test/Model/RDFGraphTest.cs @@ -220,19 +220,39 @@ public void ShouldAddTriple() Assert.IsTrue(graph.TriplesCount == 1); Assert.IsTrue(graph.IndexedTriples.ContainsKey(triple.TripleID)); + Assert.IsTrue(graph.Count(t => t.TripleMetadata is null) == 1); + Assert.IsTrue(graph.Count(t => t.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsInference) == 0); + Assert.IsTrue(graph.Count(t => t.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsImport) == 0); } [TestMethod] public void ShouldAddTripleAsInference() { RDFGraph graph = new RDFGraph(); - RDFTriple triple = new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("http://obj/")).SetInference(); + RDFTriple triple = new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("http://obj/")) + .SetMetadata(RDFModelEnums.RDFTripleMetadata.IsInference); graph.AddTriple(triple); Assert.IsTrue(graph.TriplesCount == 1); Assert.IsTrue(graph.IndexedTriples.ContainsKey(triple.TripleID)); - Assert.IsTrue(graph.Count(t => t.IsInference) == 1); - + Assert.IsTrue(graph.Count(t => t.TripleMetadata is null) == 0); + Assert.IsTrue(graph.Count(t => t.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsInference) == 1); + Assert.IsTrue(graph.Count(t => t.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsImport) == 0); + } + + [TestMethod] + public void ShouldAddTripleAsImport() + { + RDFGraph graph = new RDFGraph(); + RDFTriple triple = new RDFTriple(new RDFResource("http://subj/"), new RDFResource("http://pred/"), new RDFResource("http://obj/")) + .SetMetadata(RDFModelEnums.RDFTripleMetadata.IsImport); + graph.AddTriple(triple); + + Assert.IsTrue(graph.TriplesCount == 1); + Assert.IsTrue(graph.IndexedTriples.ContainsKey(triple.TripleID)); + Assert.IsTrue(graph.Count(t => t.TripleMetadata is null) == 0); + Assert.IsTrue(graph.Count(t => t.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsInference) == 0); + Assert.IsTrue(graph.Count(t => t.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsImport) == 1); } [TestMethod] diff --git a/RDFSharp.Test/Model/RDFTripleTest.cs b/RDFSharp.Test/Model/RDFTripleTest.cs index 131f9b91..046651fa 100644 --- a/RDFSharp.Test/Model/RDFTripleTest.cs +++ b/RDFSharp.Test/Model/RDFTripleTest.cs @@ -49,9 +49,9 @@ public void ShouldCreateSPOTriple(string s, string p, string o) RDFTriple triple2 = new RDFTriple(subj, pred, obj); Assert.IsTrue(triple.Equals(triple2)); - Assert.IsFalse(triple.IsInference); - triple.SetInference(); - Assert.IsTrue(triple.IsInference); + Assert.IsNull(triple.TripleMetadata); + triple.SetMetadata(RDFModelEnums.RDFTripleMetadata.IsInference); + Assert.IsTrue(triple.TripleMetadata == RDFModelEnums.RDFTripleMetadata.IsInference); } [DataTestMethod] diff --git a/RDFSharp.Test/RDFSharp.Test.csproj b/RDFSharp.Test/RDFSharp.Test.csproj index d7fa3139..55aa9270 100644 --- a/RDFSharp.Test/RDFSharp.Test.csproj +++ b/RDFSharp.Test/RDFSharp.Test.csproj @@ -3,7 +3,7 @@ RDFSharp.Test RDFSharp.Test $(Version) - 3.8.0 + 3.8.1 Marco De Salvo Marco De Salvo net6.0 @@ -14,7 +14,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/RDFSharp/Model/RDFGraph.cs b/RDFSharp/Model/RDFGraph.cs index 817e6908..1909c29c 100644 --- a/RDFSharp/Model/RDFGraph.cs +++ b/RDFSharp/Model/RDFGraph.cs @@ -51,8 +51,8 @@ public IEnumerator TriplesEnumerator foreach (RDFIndexedTriple indexedTriple in IndexedTriples.Values) { yield return indexedTriple.TripleFlavor == RDFModelEnums.RDFTripleFlavors.SPO - ? new RDFTriple(GraphIndex.ResourcesRegister[indexedTriple.SubjectID], GraphIndex.ResourcesRegister[indexedTriple.PredicateID], GraphIndex.ResourcesRegister[indexedTriple.ObjectID]) { IsInference = indexedTriple.IsInference } - : new RDFTriple(GraphIndex.ResourcesRegister[indexedTriple.SubjectID], GraphIndex.ResourcesRegister[indexedTriple.PredicateID], GraphIndex.LiteralsRegister[indexedTriple.ObjectID]) { IsInference = indexedTriple.IsInference }; + ? new RDFTriple(GraphIndex.ResourcesRegister[indexedTriple.SubjectID], GraphIndex.ResourcesRegister[indexedTriple.PredicateID], GraphIndex.ResourcesRegister[indexedTriple.ObjectID]) { TripleMetadata = indexedTriple.TripleMetadata } + : new RDFTriple(GraphIndex.ResourcesRegister[indexedTriple.SubjectID], GraphIndex.ResourcesRegister[indexedTriple.PredicateID], GraphIndex.LiteralsRegister[indexedTriple.ObjectID]) { TripleMetadata = indexedTriple.TripleMetadata }; } } } diff --git a/RDFSharp/Model/RDFModelEnums.cs b/RDFSharp/Model/RDFModelEnums.cs index caf4e1f0..7981120e 100644 --- a/RDFSharp/Model/RDFModelEnums.cs +++ b/RDFSharp/Model/RDFModelEnums.cs @@ -45,7 +45,7 @@ public enum RDFFormats }; /// - /// RDFTripleFlavors represents an enumeration for possible triple pattern flavors. + /// RDFTripleFlavors represents an enumeration for possible triple flavors. /// public enum RDFTripleFlavors { @@ -59,6 +59,21 @@ public enum RDFTripleFlavors SPL = 2 }; + /// + /// RDFTripleMetadata represents an enumeration for possible types of triple metadata. + /// + public enum RDFTripleMetadata + { + /// + /// Indicates that the triple has been emitted in consequence of any kind of reasoning + /// + IsInference = 1, + /// + /// Indicates that the triple has been imported from an external source (e.g: an ontology) + /// + IsImport = 2 + }; + /// /// RDFDatatypes represents an enumeration for supported datatypes (RDF/RDFS/XSD). /// diff --git a/RDFSharp/Model/RDFTriple.cs b/RDFSharp/Model/RDFTriple.cs index 3556277a..c445ab42 100644 --- a/RDFSharp/Model/RDFTriple.cs +++ b/RDFSharp/Model/RDFTriple.cs @@ -38,9 +38,9 @@ public class RDFTriple : IEquatable public RDFModelEnums.RDFTripleFlavors TripleFlavor { get; internal set; } /// - /// Indicates that the triple has been emitted in consequence of any kind of reasoning + /// Metadata of the triple /// - public bool IsInference { get; internal set;} + public RDFModelEnums.RDFTripleMetadata? TripleMetadata { get; internal set; } /// /// Member acting as subject token of the triple @@ -78,7 +78,6 @@ public RDFTriple(RDFResource subj, RDFResource pred, RDFResource obj) #endregion TripleFlavor = RDFModelEnums.RDFTripleFlavors.SPO; - IsInference = false; Subject = subj ?? new RDFResource(); Predicate = pred; Object = obj ?? new RDFResource(); @@ -99,10 +98,9 @@ public RDFTriple(RDFResource subj, RDFResource pred, RDFLiteral lit) #endregion TripleFlavor = RDFModelEnums.RDFTripleFlavors.SPL; - IsInference = false; Subject = subj ?? new RDFResource(); Predicate = pred; - Object = lit ?? new RDFPlainLiteral(string.Empty); + Object = lit ?? new RDFPlainLiteral(string.Empty); LazyTripleID = new Lazy(() => RDFModelUtilities.CreateHash(ToString())); LazyReificationSubject = new Lazy(() => new RDFResource(string.Concat("bnode:", TripleID.ToString()))); } @@ -113,7 +111,7 @@ public RDFTriple(RDFResource subj, RDFResource pred, RDFLiteral lit) internal RDFTriple(RDFIndexedTriple indexedTriple, RDFGraphIndex graphIndex) { TripleFlavor = indexedTriple.TripleFlavor; - IsInference = indexedTriple.IsInference; + TripleMetadata = indexedTriple.TripleMetadata; Subject = graphIndex.ResourcesRegister[indexedTriple.SubjectID]; Predicate = graphIndex.ResourcesRegister[indexedTriple.PredicateID]; if (indexedTriple.TripleFlavor == RDFModelEnums.RDFTripleFlavors.SPO) @@ -165,11 +163,11 @@ public Task ReifyTripleAsync() => Task.Run(() => new RDFAsyncGraph(ReifyTriple())); /// - /// Sets the triple as emitted by any kind of reasoning + /// Sets the metadata of the triple /// - public RDFTriple SetInference() + public RDFTriple SetMetadata(RDFModelEnums.RDFTripleMetadata? tripleMetadata) { - IsInference = true; + TripleMetadata = tripleMetadata; return this; } #endregion @@ -207,9 +205,9 @@ internal class RDFIndexedTriple : IEquatable internal RDFModelEnums.RDFTripleFlavors TripleFlavor { get; set; } /// - /// Indicates that the triple has been emitted in consequence of any kind of reasoning + /// Metadata of the triple /// - internal bool IsInference { get; set; } + internal RDFModelEnums.RDFTripleMetadata? TripleMetadata { get; set; } #endregion #region Ctor @@ -219,7 +217,7 @@ internal class RDFIndexedTriple : IEquatable internal RDFIndexedTriple(RDFTriple triple) { TripleFlavor = triple.TripleFlavor; - IsInference = triple.IsInference; + TripleMetadata = triple.TripleMetadata; TripleID = triple.TripleID; SubjectID = triple.Subject.PatternMemberID; PredicateID = triple.Predicate.PatternMemberID; diff --git a/RDFSharp/RDFSharp.csproj b/RDFSharp/RDFSharp.csproj index af318f9c..19da9d16 100644 --- a/RDFSharp/RDFSharp.csproj +++ b/RDFSharp/RDFSharp.csproj @@ -3,7 +3,7 @@ RDFSharp RDFSharp $(Version) - 3.8.0 + 3.8.1 Marco De Salvo Marco De Salvo Lightweight and friendly .NET library for realizing Semantic Web applications