public static void Main16() { string path = "../../../"; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); Random rnd = new Random(); Console.WriteLine("Start GetStarted/Main16"); int cnt = 0; Func <Stream> GenStream = () => new FileStream(path + "Databases/f" + (cnt++) + ".bin", FileMode.OpenOrCreate, FileAccess.ReadWrite); TripleStoreInt32 store = new TripleStoreInt32(GenStream); int npersons = 4_000_000; bool toload = false; if (toload) { //nt.Clear(); //nt.GetSetStr("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); //int name_cod = nt.GetSetStr("http://fogid.net/o/name"); IEnumerable <object> qu_persons = Enumerable.Range(0, npersons) .SelectMany(i => { return(new object[] { new object[] { "p" + i, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", new object[] { 1, "http://fogid.net/o/person" } }, new object[] { "p" + i, "http://fogid.net/o/name", new object[] { 2, "p" + i } }, new object[] { "p" + i, "http://fogid.net/o/age", new object[] { 2, "33 years" } } }); }); IEnumerable <object> qu_fotos = Enumerable.Range(0, npersons * 2) .SelectMany(i => { return(new object[] { new object[] { "f" + i, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", new object[] { 1, "http://fogid.net/o/photo" } }, new object[] { "f" + i, "http://fogid.net/o/name", new object[] { 2, "DSP" + i } } }); }); IEnumerable <object> qu_reflections = Enumerable.Range(0, npersons * 6) .SelectMany(i => { return(new object[] { new object[] { "r" + i, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", new object[] { 1, "http://fogid.net/o/reflection" } }, new object[] { "r" + i, "http://fogid.net/o/reflected", new object[] { 1, "p" + rnd.Next(npersons) } }, new object[] { "r" + i, "http://fogid.net/o/indoc", new object[] { 1, "f" + rnd.Next(npersons * 2) } } }); }); sw.Restart(); var ntriples = store.GenerateTripleFlow(qu_persons.Concat(qu_fotos).Concat(qu_reflections)); foreach (var t in ntriples.Skip(98).Take(10)) { Console.WriteLine(store.ToStr(t)); } store.Build(ntriples); sw.Stop(); Console.WriteLine($"store Build ok. Duration={sw.ElapsedMilliseconds}"); } else { sw.Restart(); store.Refresh(); sw.Stop(); Console.WriteLine($"Refresh for Phototeka {npersons} persons. Duration={sw.ElapsedMilliseconds}"); } // Испытываю // Беру персону string id = "p" + (npersons * 2 / 3); int nid, reflected, indoc, name; if (!store.TryGetCode(id, out nid)) { throw new Exception("338433"); } if (!store.TryGetCode("http://fogid.net/o/reflected", out reflected)) { throw new Exception("338434"); } if (!store.TryGetCode("http://fogid.net/o/indoc", out indoc)) { throw new Exception("338435"); } if (!store.TryGetCode("http://fogid.net/o/name", out name)) { throw new Exception("338436"); } var query1 = store.GetInverse(nid) .Cast <object[]>() .Where(t => (int)t[1] == reflected) .SelectMany(t => store.GetBySubj((int)t[0]) .Where(tt => (int)((object[])tt)[1] == indoc) .Select(tt => store.GetBySubj((int)((object[])((object[])tt)[2])[1]) .Where(ttt => (int)((object[])ttt)[1] == name) .FirstOrDefault()) ) ; foreach (object[] t in query1) { Console.WriteLine(store.DecodeTriple(t)); } Console.WriteLine(); int nprobe = 1000; int total = 0; sw.Restart(); for (int i = 0; i < nprobe; i++) { // Беру случайную персону if (!store.TryGetCode("p" + rnd.Next(npersons), out nid)) { throw new Exception("338437"); } var fots = store.GetInverse(nid) .Cast <object[]>() .Where(t => (int)t[1] == reflected) .SelectMany(t => store.GetBySubj((int)t[0]) .Where(tt => (int)((object[])tt)[1] == indoc) .Select(tt => store.GetBySubj((int)((object[])((object[])tt)[2])[1]) .Where(ttt => (int)((object[])ttt)[1] == name) .FirstOrDefault()) ).ToArray(); total += fots.Length; } sw.Stop(); Console.WriteLine($"{nprobe} tests ok. Duration={sw.ElapsedMilliseconds}"); Console.WriteLine("========"); var que = store.GetByObjName("p2").ToArray(); foreach (var tri in que) { Console.WriteLine(store.ToStr(tri)); } sw.Restart(); total = 0; for (int i = 0; i < nprobe; i++) { string scod = "p" + rnd.Next(npersons); total += store.GetByObjName(scod).Where(obj => (string)((object[])((object[])obj)[2])[1] == scod).Count(); } sw.Stop(); Console.WriteLine($"{nprobe} GetByObjString tests ok. Duration={sw.ElapsedMilliseconds} total={total}"); Console.WriteLine(); return; // конец проверки int nelements = 5_000_000; // Начало таблицы имен 0 - type, 1 - name, 2 - person, 3 - parent int b = 4; // Начальный индекс назначаемых идентификаторов сущностей if (toload) { sw.Restart(); var query = Enumerable.Range(0, nelements) .SelectMany(i => new object[] { new object[] { nelements + b - i - 1, 0, new object[] { 1, 2 } }, new object[] { nelements + b - i - 1, 1, new object[] { 2, "" + (nelements + b - i - 1) } }, new object[] { nelements + b - i - 1, 3, new object[] { 1, rnd.Next(nelements) + b } } // родитель }); // по 3 триплета на запись store.Build(query); sw.Stop(); Console.WriteLine($"load of {nelements * 2} triples ok. Duration={sw.ElapsedMilliseconds}"); } else { sw.Restart(); store.Refresh(); sw.Stop(); Console.WriteLine($"Refresh for {nelements * 2} triples ok. Duration={sw.ElapsedMilliseconds}"); } // Для проверки работы запрошу запись с ключом nelements * 2 / 3 int ke = nelements * 2 / 3 + 2; var qu = store.GetBySubj(ke); foreach (object[] t in qu) { Console.WriteLine($"{t[0]} {t[1]}"); } var qui = store.GetInverse(ke); foreach (object[] t in qui) { Console.WriteLine($"{t[0]} {t[1]} {((object[])t[2])[1]}"); } nprobe = 1000; sw.Restart(); for (int i = 0; i < nprobe; i++) { int subj = rnd.Next(nelements); var quer = store.GetBySubj(subj); if (quer.Count() != 3) { foreach (object[] t in quer) { Console.WriteLine($"{t[0]} {t[1]}"); } } } sw.Stop(); Console.WriteLine($"{nelements} elements {nprobe} GetAll search ok. duration={sw.ElapsedMilliseconds}"); sw.Restart(); total = 0; for (int i = 0; i < nprobe; i++) { int obj = rnd.Next(nelements); var quer = store.GetInverse(obj); total += quer.Count(); } sw.Stop(); Console.WriteLine($"inverse elements {nprobe} GetInverse search ok. duration={sw.ElapsedMilliseconds} total = {total}"); return; var qu2 = store.GetByObjName("p12345"); foreach (object[] t in qu2) { Console.WriteLine($"{t[0]} {t[1]}"); } nprobe = 1000; sw.Restart(); total = 0; for (int i = 0; i < nprobe; i++) { var quer = store.GetByObjName("" + rnd.Next(nelements)); total += quer.Count(); } sw.Stop(); Console.WriteLine($"Test === OBJECT===== {nprobe} queries for {total} elements. duration={sw.ElapsedMilliseconds}"); }
static void Main19() { string path = "/Home/data/Databases/"; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); Random rnd = new Random(); //Random rnd = new Random(11111); Console.WriteLine("Start TripleStore experiments"); int cnt = 0; Func <Stream> GenStream = () => new FileStream(path + "f" + (cnt++) + ".bin", FileMode.OpenOrCreate, FileAccess.ReadWrite); TripleStoreInt32 store = new TripleStoreInt32(GenStream, path); int npersons = 40_000; bool toload = true; if (toload) { IEnumerable <object> qu_persons = Enumerable.Range(0, npersons) .SelectMany(i => { return(new object[] { new object[] { "p" + i, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", new object[] { 1, "http://fogid.net/o/person" } }, new object[] { "p" + i, "http://fogid.net/o/name", new object[] { 2, "p" + i } }, new object[] { "p" + i, "http://fogid.net/o/age", new object[] { 2, "33 years" } } }); }); IEnumerable <object> qu_fotos = Enumerable.Range(0, npersons * 2) .SelectMany(i => { return(new object[] { new object[] { "f" + i, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", new object[] { 1, "http://fogid.net/o/photo" } }, new object[] { "f" + i, "http://fogid.net/o/name", new object[] { 2, "DSP" + i } } }); }); IEnumerable <object> qu_reflections = Enumerable.Range(0, npersons * 6) .SelectMany(i => { return(new object[] { new object[] { "r" + i, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", new object[] { 1, "http://fogid.net/o/reflection" } }, new object[] { "r" + i, "http://fogid.net/o/reflected", new object[] { 1, "p" + rnd.Next(npersons) } }, new object[] { "r" + i, "http://fogid.net/o/indoc", new object[] { 1, "f" + rnd.Next(npersons * 2) } } }); }); var triples_set = qu_persons.Concat(qu_fotos).Concat(qu_reflections); sw.Restart(); store.Clear(); store.Load(triples_set); store.Build(); sw.Stop(); Console.WriteLine($"store Build ok. Duration={sw.ElapsedMilliseconds}"); } else { sw.Restart(); store.Refresh(); sw.Stop(); Console.WriteLine($"Refresh for Phototeka {npersons} persons. Duration={sw.ElapsedMilliseconds}"); } // Испытываю Console.WriteLine("===== single GetBySubject ====="); // Беру персону string id = "p" + (npersons * 2 / 3); // Проверяю работу выборки по субъекту var trs = store.Get_s(id); // Печатаю foreach (object[] t in trs) { Console.WriteLine(store.TripleToString(t)); } Console.WriteLine("===== single GetInverse ====="); var trs2 = store.Get_t(id); // Печатаю foreach (object[] t in trs2) { Console.WriteLine(store.TripleToString(t)); } Console.WriteLine("===== 1000 GetBySubject ====="); sw.Restart(); int ntriples = 0; for (int i = 0; i < 1000; i++) { string c = "p" + rnd.Next(npersons); ntriples += store.Get_s(c).Count(); } sw.Stop(); Console.WriteLine($"ok. duration={sw.ElapsedMilliseconds}"); int pers = (npersons * 2 / 30); //pers = 243; //24; Console.WriteLine($"===== single Like {"p" + pers} ====="); var trs3 = store.Like("p" + pers).ToArray(); // Печатаю foreach (object[] t in trs3) { Console.WriteLine(store.TripleToString(t)); } if (!store.TryGetCode(id, out int nid)) { throw new Exception("222233"); } //var trs2 = store.GetInverse(nid); //// Печатаю //foreach (object[] t in trs2) Console.WriteLine(store.DecodeTriple(t)); // return; int reflected, indoc, name; Console.WriteLine("===== Complex query ====="); if (!store.TryGetCode("http://fogid.net/o/reflected", out reflected)) { throw new Exception("338434"); } if (!store.TryGetCode("http://fogid.net/o/indoc", out indoc)) { throw new Exception("338435"); } if (!store.TryGetCode("http://fogid.net/o/name", out name)) { throw new Exception("338436"); } var query1 = store.Get_t(nid) .Cast <object[]>() .Where(t => (int)t[1] == reflected) .SelectMany(t => store.Get_s((int)t[0]) .Where(tt => (int)((object[])tt)[1] == indoc) .Select(tt => store.Get_s((int)((object[])((object[])tt)[2])[1]) .Where(ttt => (int)((object[])ttt)[1] == name) .FirstOrDefault()) ) ; foreach (object[] t in query1) { Console.WriteLine(store.TripleToString(t)); } Console.WriteLine(); Console.WriteLine("===== 1000 GetBySubject ====="); int nprobe = 1000; int total = 0; sw.Restart(); for (int i = 0; i < nprobe; i++) { // Беру случайную персону if (!store.TryGetCode("p" + rnd.Next(npersons), out nid)) { throw new Exception("338437"); } var fots = store.Get_t(nid) //.Cast<object[]>() //.Where(t => (int)t[1] == reflected) //.SelectMany(t => store.Get_s((int)t[0]) // .Where(tt => (int)((object[])tt)[1] == indoc) // .Select(tt => store.Get_s((int)((object[])((object[])tt)[2])[1]) // .Where(ttt => (int)((object[])ttt)[1] == name) // .FirstOrDefault())) ; total += fots.Count(); } sw.Stop(); Console.WriteLine($"{nprobe} tests ok. Duration={sw.ElapsedMilliseconds} total={total}"); /* * var que = store.GetByObjName("p2").ToArray(); * foreach (var tri in que) * { * Console.WriteLine(store.ToStr(tri)); * } * * sw.Restart(); * total = 0; * for (int i = 0; i < nprobe; i++) * { * string scod = "p" + rnd.Next(npersons); * total += store.GetByObjName(scod).Where(obj => (string)((object[])((object[])obj)[2])[1] == scod).Count(); * } * sw.Stop(); * Console.WriteLine($"{nprobe} GetByObjString tests ok. Duration={sw.ElapsedMilliseconds} total={total}"); * Console.WriteLine(); */ }