private static void ConvertPostLinks(SiteUris uris, XmlReader r, SequentialTurtleWriter w) { var unknownLinkTypeIds = new UnknownValueStore <string>(); while (r.Read()) { switch (r.NodeType) { case XmlNodeType.Element: switch (r.LocalName) { case "row": using (var subR = r.ReadSubtree()) { subR.Read(); ConvertPostLink(uris, subR, w, unknownLinkTypeIds); } break; } break; case XmlNodeType.EndElement: long unknownLinkTypeIdCount = unknownLinkTypeIds.RegisteredValueCount; if (unknownLinkTypeIdCount > 0) { ConsoleHelper.WriteWarningLine("{0} unknown LinkTypeId value(s) found: {1}", unknownLinkTypeIdCount, unknownLinkTypeIds); } return; } } }
private static void ConvertPostLink(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownLinkTypeIds) { if (r.MoveToAttribute("LinkTypeId")) { switch (r.Value) { case "1": // linked if (r.MoveToAttribute("PostId")) { w.StartTriple(uris.CreatePostUri(r.Value)); if (r.MoveToAttribute("RelatedPostId")) { w.AddToTriple(uris.GeneralUris.LinkProperty, uris.CreatePostUri(r.Value)); } } break; case "3": // duplicate if (r.MoveToAttribute("RelatedPostId")) { w.StartTriple(uris.CreatePostUri(r.Value)); if (r.MoveToAttribute("PostId")) { w.AddToTriple(uris.GeneralUris.DuplicateProperty, uris.CreatePostUri(r.Value)); } } break; default: unknownLinkTypeIds.RegisterUnknownValue(r.Value); break; } } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No LinkTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml()); } }
private static void ConvertVote(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownVoteTypeIds) { Uri subjectUri; if (r.MoveToAttribute("Id")) { subjectUri = uris.CreateVoteUri(r.Value); w.StartTriple(subjectUri); } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No Id attribute found on element {0}. Skipping element.", r.ReadOuterXml()); return; } if (r.MoveToAttribute("VoteTypeId")) { switch (r.Value) { case "1": // acceptance if (GlobalData.Options.FullTimeInfo) { w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.AcceptanceType); uris.LinkToSite(w); if (r.MoveToAttribute("PostId")) { w.StartTriple(uris.CreatePostUri(r.Value)); w.AddToTriple(uris.GeneralUris.AcceptanceProperty, subjectUri); w.StartTriple(subjectUri); } if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } } break; case "2": // upvote if (GlobalData.Options.FullTimeInfo) { w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.UpVoteType); uris.LinkToSite(w); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("PostId")) { w.StartTriple(uris.CreatePostUri(r.Value)); w.AddToTriple(uris.GeneralUris.VoteProperty, subjectUri); w.StartTriple(subjectUri); } } break; case "3": // downvote if (GlobalData.Options.FullTimeInfo) { w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.DownVoteType); uris.LinkToSite(w); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("PostId")) { w.StartTriple(uris.CreatePostUri(r.Value)); w.AddToTriple(uris.GeneralUris.VoteProperty, subjectUri); w.StartTriple(subjectUri); } } break; case "4": // offensive break; case "5": // favorite if (GlobalData.Options.FullTimeInfo) { w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.FavoriteType); uris.LinkToSite(w); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("PostId")) { w.AddToTriple(uris.GeneralUris.PostProperty, uris.CreatePostUri(r.Value)); } if (r.MoveToAttribute("UserId")) { w.StartTriple(uris.CreateUserUri(r.Value)); w.AddToTriple(uris.GeneralUris.FavoriteProperty, subjectUri); w.StartTriple(subjectUri); } } else { if (r.MoveToAttribute("UserId")) { w.StartTriple(uris.CreateUserUri(r.Value)); if (r.MoveToAttribute("PostId")) { w.AddToTriple(uris.GeneralUris.FavoriteProperty, uris.CreatePostUri(r.Value)); } w.StartTriple(subjectUri); } } break; case "6": // closed break; case "7": // reopened break; case "8": // bounty started w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.StartOfBountyType); if (r.MoveToAttribute("PostId")) { w.AddToTriple(uris.GeneralUris.PostProperty, uris.CreatePostUri(r.Value)); } if (r.MoveToAttribute("UserId")) { w.AddToTriple(uris.GeneralUris.DonorProperty, uris.CreateUserUri(r.Value)); } if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("BountyAmount")) { w.AddToTriple(uris.GeneralUris.OfferedAmountProperty, long.Parse(r.Value)); } break; case "9": // bounty closed w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.EndOfBountyType); if (r.MoveToAttribute("PostId")) { w.AddToTriple(uris.GeneralUris.AnswerProperty, uris.CreatePostUri(r.Value)); } if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("BountyAmount")) { w.AddToTriple(uris.GeneralUris.TransferredAmountProperty, long.Parse(r.Value)); } break; case "10": // deletion break; case "11": // undeletion break; case "12": // spam break; case "13": // moderator informed break; case "15": // under moderator review break; case "16": // approved edit suggestion break; default: unknownVoteTypeIds.RegisterUnknownValue(r.Value); break; } } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No VoteTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml()); } }
private static void ConvertPostHistoryItem(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownPostHistoryTypeIds) { Uri subjectUri; if (r.MoveToAttribute("Id")) { subjectUri = uris.CreatePostHistoryUri(r.Value); w.StartTriple(subjectUri); } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No Id attribute found on element {0}. Skipping element.", r.ReadOuterXml()); return; } if (r.MoveToAttribute("PostHistoryTypeId")) { switch (r.Value) { case "1": // initial title break; case "2": // initial body break; case "3": // initial tags break; case "4": // edit title break; case "5": // edit body break; case "6": // edit tags break; case "7": // rollback title break; case "8": // rollback body break; case "9": // rollback tags break; case "10": // post closed w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostClosureType); if (r.MoveToAttribute("Comment")) { switch (r.Value) { case "1": // Exact Duplicate case "101": // duplicate w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.DuplicateCloseReason); break; case "2": // Off-topic case "102": // Off-topic w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.OffTopicCloseReason); break; case "3": // Subjective and argumentative case "105": // Primarily opinion-based w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.SubjectiveCloseReason); break; case "4": // Not a real question w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.NotAQuestionCloseReason); break; case "7": // Too localized w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.TooLocalizedCloseReason); break; case "10": // General reference w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.GeneralReferenceCloseReason); break; case "20": // Noise or pointless w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.NoiseCloseReason); break; case "103": // Unclear what you're asking w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.UnclearCloseReason); break; case "104": // Too broad w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.TooBroadCloseReason); break; default: ConsoleHelper.WriteWarningLine("Unknown post close reason: {0}", r.Value); break; } } if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "11": // post reopened w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostReopeningType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "12": // post deleted w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostDeletionType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "13": // post undeleted w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostUndeletionType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "14": // post locked w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostLockingType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "15": // post unlocked w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostUnlockingType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "16": // community owned break; case "17": // post migrated superseded with 35/36 break; case "18": // question merged break; case "19": // question protected w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostProtectionType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "20": // question unprotected w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostUnprotectionType); if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } AddParticipants(uris, r, w); LinkToPost(uris, subjectUri, r, w); break; case "21": // post disassociated break; case "22": // question unmerged break; case "24": // suggested edit applied break; case "25": // post tweeted break; case "31": // comment discussion moved to chat break; case "33": // post notice added break; case "34": // post notice removed break; case "35": // post migrated away replaces 17 break; case "36": // post migrated here replaces 17 break; case "37": // post merge source break; case "38": // post merge destination break; default: unknownPostHistoryTypeIds.RegisterUnknownValue(r.Value); break; } } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No PostHistoryTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml()); } }
private static void ConvertPost(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownPostTypeIds) { Uri subjectUri; if (r.MoveToAttribute("Id")) { subjectUri = uris.CreatePostUri(r.Value); w.StartTriple(subjectUri); } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No Id attribute found on element {0}. Skipping element.", r.ReadOuterXml()); return; } if (r.MoveToAttribute("PostTypeId")) { switch (r.Value) { case "1": // question w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.QuestionType); uris.LinkToSite(w); if (r.MoveToAttribute("AcceptedAnswerId")) { w.AddToTriple(uris.GeneralUris.AcceptedAnswerProperty, uris.CreatePostUri(r.Value)); } if (r.MoveToAttribute("ViewCount")) { w.AddToTriple(uris.GeneralUris.ViewCountProperty, long.Parse(r.Value)); } if (r.MoveToAttribute("Title")) { w.AddToTriple(uris.GeneralUris.TitleProperty, r.Value); w.AddToTriple(uris.GeneralUris.LabelProperty, r.Value); } if (r.MoveToAttribute("Score")) { w.AddToTriple(uris.GeneralUris.ScoreProperty, long.Parse(r.Value)); } break; case "2": // answer w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.AnswerType); uris.LinkToSite(w); if (r.MoveToAttribute("ParentId")) { w.StartTriple(uris.CreatePostUri(r.Value)); w.AddToTriple(uris.GeneralUris.AnswerProperty, subjectUri); w.StartTriple(subjectUri); } else { ConsoleHelper.WriteWarningLine("Orphaned answer: {0}", subjectUri); } if (r.MoveToAttribute("Score")) { w.AddToTriple(uris.GeneralUris.ScoreProperty, long.Parse(r.Value)); } break; case "3": // orphaned tag wiki break; case "4": // tag info excerpt w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.TagExcerptType); break; case "5": // tag description w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.TagDescriptionType); break; case "6": // moderator nomination break; case "7": // "Wiki placeholder" (seems to only be the election description) //w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.SiteInfoType); break; default: unknownPostTypeIds.RegisterUnknownValue(r.Value); break; } if (r.MoveToAttribute("CreationDate")) { w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("LastEditDate")) { w.AddToTriple(uris.GeneralUris.LastEditDateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("LastActivity")) { w.AddToTriple(uris.GeneralUris.LastActivityDateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture)); } if (r.MoveToAttribute("OwnerUserId")) { w.AddToTriple(uris.GeneralUris.OwnerProperty, uris.CreateUserUri(r.Value)); } // TODO: LastEditorUserId (given in post history) // TODO: FavoriteCount (linked to users?) if (r.MoveToAttribute("Body")) { w.AddToTriple(uris.GeneralUris.DescriptionProperty, r.Value); } if (r.MoveToAttribute("Tags")) { w.AddToTriple(uris.GeneralUris.TagProperty, tagRegex.Matches(r.Value).Cast <Match>().Select(m => uris.CreateTagUri(m.Groups[1].Value))); } } else { r.MoveToElement(); ConsoleHelper.WriteErrorLine("No PostTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml()); } }