public NormalizedRdf NormalizeRdf(HashSet <Triple> triples) { var nState = new NormalizationState(); var normalizedTriples = new HashSet <Triple>(); List <string> hashList; foreach (var t in triples) //4.4.2 2) { if (t.Subject.IsBlankNode()) { AddEntryToDictionaryList(nState.BNodesToQuads, t.Subject.AsBlankNode().ValueAsString(), t); } if (t.Object.IsBlankNode()) { AddEntryToDictionaryList(nState.BNodesToQuads, t.Object.AsBlankNode().ValueAsString(), t); } } var nonNormalizedNodes = new List <string>(nState.BNodesToQuads.Keys); //4.4.2 3) var simple = true; //4.4.2 4) while (simple) { simple = false; //4.4.2 5.1) nState.HashToBNodes.Clear(); //4.4.2 5.2) foreach (var bN in nonNormalizedNodes) //4.4.2 5.3) { var hash = HashFirstDegree(bN, nState.BNodesToQuads); //4.4.2 5.3.1) --> 4.6.2 AddEntryToDictionaryList(nState.HashToBNodes, hash, bN); //4.4.2 5.3.2) } hashList = new List <string>(nState.HashToBNodes.Keys); hashList.Sort(); foreach (var h in hashList) //4.4.2 5.4) { if (nState.HashToBNodes[h].Count <= 1) //4.4.2 5.4.1) { nState.CanonicalIssuer.IssueIdentifier(nState.HashToBNodes[h][0]); //4.4.2 5.4.2) nonNormalizedNodes.Remove(nState.HashToBNodes[h][0]); //4.4.2 5.3) nState.HashToBNodes.Remove(h); //4.4.2 5.4.4) simple = true; //4.4.2 5.4.5) } } } hashList = new List <string>(nState.HashToBNodes.Keys); hashList.Sort(); foreach (var h in hashList) { var hashPathList = new List <(string, IdentifierIssuer)>(); foreach (var identifier in nState.HashToBNodes[h]) { if (nState.CanonicalIssuer.IsIssued(identifier)) //4.4.2 6.2.1) { continue; } var tIssuer = new IdentifierIssuer("_:b"); //4.4.2 6.2.2) tIssuer.IssueIdentifier(identifier); //4.4.2 6.2.3) hashPathList.Add(HashNDegree(identifier, nState, tIssuer)); } hashPathList.Sort(delegate((string, IdentifierIssuer)x, (string, IdentifierIssuer)y) { return(String.Compare(x.Item1, y.Item1)); });
public NormalizationState(string prefix = "_:c14n") { CanonicalIssuer = new IdentifierIssuer(prefix); BNodesToQuads = new Dictionary <string, List <Triple> >(); HashToBNodes = new Dictionary <string, List <string> >(); }
private IdentifierIssuer(IdentifierIssuer i) { _identifierPrefix = i._identifierPrefix; IdentifierCounter = i.IdentifierCounter; IssuedIdentifiers = new Dictionary <string, string>(i.IssuedIdentifiers); }