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(); */ }