Beispiel #1
0
 private void LoadQuadsAndN4()
 {
     n4.StartSerialFlow();
     n4.S();
     quads.StartSerialFlow();
     quads.S();
     foreach (var tri in triplets.Root.Elements())
     {
         object[] tri_uni = (object[])tri.Get();
         int      tag     = (int)tri_uni[0];
         object[] rec     = (object[])tri_uni[1];
         int      hs_s    = ((string)rec[0]).GetHashCode();
         int      hs_p    = ((string)rec[1]).GetHashCode();
         if (tag == 1) // объектое свойство
         {
             int hs_o = ((string)rec[2]).GetHashCode();
             quads.V(new object[] { hs_s, 0, hs_p, tri.offset });
             quads.V(new object[] { hs_o, 1, hs_p, tri.offset });
         }
         else // поле данных
         {
             quads.V(new object[] { hs_s, 2, hs_p, tri.offset });
             if ((string)rec[1] != sema2012m.ONames.p_name)
             {
                 continue;
             }
             // Поместим информацию в таблицу имен n4
             string name  = (string)rec[2];
             string name4 = name.Length <= 4 ? name : name.Substring(0, 4);
             n4.V(new object[] { hs_s, name4.ToLower().GetHashCode() });
         }
     }
     quads.Se();
     quads.EndSerialFlow();
     n4.Se();
     n4.EndSerialFlow();
     // Сохранение
     quads.Flush();
     n4.Flush();
 }
Beispiel #2
0
        public void Load(int numb)
        {
            cell.Clear();
            int portion = 200;

            cell.StartSerialFlow();
            cell.S();
            for (int i = 0; i < numb / portion; i++)
            {
                if (i % 1000 == 0)
                {
                    Console.WriteLine("{0}%", (double)i * 100.0 / (double)numb * (double)portion);
                }
                for (int j = 0; j < portion; j++)
                {
                    int value = i * portion + j; // rnd.Next();
                    cell.V(value);
                }
            }
            cell.Se();
            cell.EndSerialFlow();
            cell.Flush();
        }
Beispiel #3
0
        private void LoadQuadsAndSort()
        {
            n4.StartSerialFlow();
            n4.S();
            quads.StartSerialFlow();
            quads.S();
            foreach (var tri in triplets.Root.Elements())
            {
                object[] tri_uni = (object[])tri.Value;
                int      tag     = (int)tri_uni[0];
                object[] rec     = (object[])tri_uni[1];
                int      hs_s    = ((string)rec[0]).GetHashCode();
                int      hs_p    = ((string)rec[1]).GetHashCode();
                if (tag == 1) // объектое свойство
                {
                    int hs_o = ((string)rec[2]).GetHashCode();
                    quads.V(new object[] { hs_s, 0, hs_p, tri.Offset });
                    quads.V(new object[] { hs_o, 1, hs_p, tri.Offset });
                }
                else // поле данных
                {
                    quads.V(new object[] { hs_s, 2, hs_p, tri.Offset });
                    if ((string)rec[1] != sema2012m.ONames.p_name)
                    {
                        continue;
                    }
                    // Поместим информацию в таблицу имен n4
                    string name  = (string)rec[2];
                    string name4 = name.Length <= 4 ? name : name.Substring(0, 4);
                    n4.V(new object[] { hs_s, name4.ToLower() });
                }
            }
            quads.Se();
            quads.EndSerialFlow();
            n4.Se();
            n4.EndSerialFlow();

            // Сортировка квадриков
            quads.Root.Sort((o1, o2) =>
            {
                object[] v1 = (object[])o1;
                object[] v2 = (object[])o2;
                int e1      = (int)v1[0];
                int e2      = (int)v2[0];
                int q1      = (int)v1[1];
                int q2      = (int)v2[1];
                int p1      = (int)v1[2];
                int p2      = (int)v2[2];
                return(e1 < e2 ? -3 : (e1 > e2 ? 3 :
                                       (q1 < q2 ? -2 : (q1 > q2 ? 2 :
                                                        (p1 < p2 ? -1 : (p1 > p2 ? 1 : 0))))));
            });
            // Сортировка таблицы имен
            n4.Root.Sort((o1, o2) =>
            {
                object[] v1 = (object[])o1;
                object[] v2 = (object[])o2;
                string s1   = (string)v1[1];
                string s2   = (string)v2[1];
                return(s1.CompareTo(s2));
            });
        }
Beispiel #4
0
        private int MakeTreeFree(PaCell otriples, PaCell otriples_op, PaCell dtriples_sp)
        {
            // Делаю три сканера из трех ячеек
            DiapasonScanner <SubjPredInt> fields = new DiapasonScanner <SubjPredInt>(dtriples_sp, ent =>
            {
                object[] v = (object[])ent.Get();
                return(new SubjPredInt()
                {
                    subj = (int)v[0], pred = (int)v[1]
                });
            });
            DiapasonScanner <SubjPredInt> direct = new DiapasonScanner <SubjPredInt>(otriples, ent =>
            {
                object[] v = (object[])ent.Get();
                return(new SubjPredInt()
                {
                    subj = (int)v[0], pred = (int)v[1]
                });
            });
            DiapasonScanner <SubjPredInt> inverse = new DiapasonScanner <SubjPredInt>(otriples_op, ent =>
            {
                object[] v = (object[])ent.Get();
                return(new SubjPredInt()
                {
                    subj = (int)v[2], pred = (int)v[1]
                });
            });

            // Стартуем сканеры
            fields.Start(); direct.Start(); inverse.Start();
            // Заведем ячейку для результата сканирования
            PaCell tree_free = new PaCell(tp_entitiesTree, path + "tree_free.pac", false);

            tree_free.Clear();

            int  cnt_e = 0, cnt_ep = 0;  // для отладки
            long c1 = 0, c2 = 0, c3 = 0; // для отладки

            //PaEntry ent_dtriples = dtriples.Root.Element(0); // вход для доступа к литералам
            // Начинаем тройное сканирование
            tree_free.StartSerialFlow();
            tree_free.S();
            while (fields.HasValue || direct.HasValue || inverse.HasValue)
            {
                // Здесь у нас НОВОЕ значение идентификатора
                cnt_e++;
                if (cnt_e % 10000000 == 0)
                {
                    Console.Write("{0} ", cnt_e / 10000000);
                }
                int id0 = fields.HasValue ? fields.KeyCurrent.subj : Int32.MaxValue;
                int id1 = direct.HasValue ? direct.KeyCurrent.subj : Int32.MaxValue;
                int id2 = inverse.HasValue ? inverse.KeyCurrent.subj : Int32.MaxValue;
                // Минимальное значение кода идентификатора
                int id = Math.Min(id0, Math.Min(id1, id2));

                // Начало записи
                tree_free.R();
                // Запись идентификатора
                tree_free.V(id);

                tree_free.S();
                while (fields.HasValue && fields.KeyCurrent.subj == id)
                {
                    int su   = fields.KeyCurrent.subj;
                    int pr   = fields.KeyCurrent.pred;
                    var diap = fields.Next();
                    c3 += diap.numb;

                    for (long ind = diap.start; ind < diap.start + diap.numb; ind++)
                    {
                        object[] row  = (object[])dtriples_sp.Root.Element(ind).Get();
                        int      subj = (int)row[0];
                        int      prop = (int)row[1];
                        long     off  = (long)row[2];
                        if (subj != su || prop != pr)
                        {
                            throw new Exception("Assert err: 287282");
                        }
                        tree_free.V(new object[] { prop, off });
                    }
                }
                tree_free.Se();
                tree_free.S();
                while (direct.HasValue && direct.KeyCurrent.subj == id)
                {
                    int su   = direct.KeyCurrent.subj;
                    int pr   = direct.KeyCurrent.pred;
                    var diap = direct.Next();
                    c1 += diap.numb;
                    for (long ind = diap.start; ind < diap.start + diap.numb; ind++)
                    {
                        object[] row  = (object[])otriples.Root.Element(ind).Get();
                        int      subj = (int)row[0];
                        int      prop = (int)row[1];
                        int      obj  = (int)row[2];
                        if (subj != su || prop != pr)
                        {
                            throw new Exception("Assert err: 287283");
                        }
                        tree_free.V(new object[] { prop, obj });
                    }
                }
                tree_free.Se();

                tree_free.S();
                while (inverse.HasValue && inverse.KeyCurrent.subj == id)
                {
                    int su   = inverse.KeyCurrent.subj;
                    int pr   = inverse.KeyCurrent.pred;
                    var diap = inverse.Next();
                    c2 += diap.numb;

                    tree_free.R();
                    tree_free.V(pr);
                    tree_free.S();
                    for (long ind = diap.start; ind < diap.start + diap.numb; ind++)
                    {
                        object[] row  = (object[])otriples_op.Root.Element(ind).Get();
                        int      subj = (int)row[0];
                        int      prop = (int)row[1];
                        int      obj  = (int)row[2];
                        if (obj != su || prop != pr)
                        {
                            throw new Exception("Assert err: 287284");
                        }
                        tree_free.V(subj);
                    }
                    tree_free.Se();
                    tree_free.Re();
                }
                tree_free.Se();
                // Конец записи
                tree_free.Re();
            }
            tree_free.Se();
            tree_free.EndSerialFlow();
            return(cnt_e);
        }
Beispiel #5
0
        // Из XML базы данных, выбирается множество RDF-дуг (DatatypeProperty) с предикатом http://fogid.net/o/name и формируется
        // последовательность пар (записей) имя-сущности - идентификатор сущности. Задача заключается в том, чтобы по частичному
        // имени, определить множество идентификаторов сущностей, для которых имеется похожее имя

        public static void Main(string[] args)
        {
            string path = @"..\..\..\Databases\";

            // Тестирование сортировки по ключу со слиянием
            PaEntry.bufferBytes = 40;
            PaCell cell_simple = new PaCell(new PTypeSequence(new PType(PTypeEnumeration.integer)), path + "cimple.pac", false);

            cell_simple.Clear();
            object[] arr = { 97, 1, 3, 2, 4, 9, 8, 7, 6, 0, 5, 99, 98 };
            cell_simple.Fill(arr);
            cell_simple.Flush();
            Console.WriteLine(cell_simple.Type.Interpret(cell_simple.Root.Get()));
            cell_simple.Root.SortByKey <int>(i_key => (int)i_key);
            Console.WriteLine(cell_simple.Type.Interpret(cell_simple.Root.Get()));
            return;

            PType tp_seq = new PTypeSequence(new PTypeRecord(
                                                 new NamedType("name", new PType(PTypeEnumeration.sstring)),
                                                 new NamedType("id", new PType(PTypeEnumeration.sstring))));

            DateTime tt0 = DateTime.Now;

            Console.WriteLine("Start");

            PaCell cella = new PaCell(tp_seq, path + "cella.pac", false);

            cella.Clear();

            // Заполним ячейку данными
            XElement db = XElement.Load(path + "0001.xml");

            cella.StartSerialFlow();
            cella.S();
            foreach (XElement rec in db.Elements())
            {
                XAttribute about_att = rec.Attribute(sema2012m.ONames.rdfabout);
                if (about_att == null)
                {
                    continue;
                }
                foreach (XElement prop in rec.Elements().Where(pr => pr.Name.LocalName == "name"))
                {
                    cella.V(new object[] { prop.Value, about_att.Value });
                }
            }
            cella.Se();
            cella.EndSerialFlow();
            // Проверим, что данные прочитались (должно получится 40361 пар имя-идентификатор)
            Console.WriteLine(cella.Root.Count());

            // Надо перевести данные в фиксированный формат
            PxCell cell_seqnameid = new PxCell(tp_seq, path + "seqnameid.pxc", false);

            // очистим и перекинем данные
            cell_seqnameid.Clear();
            cell_seqnameid.Fill2(cella.Root.Get());

            Console.WriteLine("======Fill ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            //// Теперь сортируем пары по первому (нулевому) полю
            //cell_seqnameid.Root.SortComparison((e1, e2) =>
            //{
            //    string s1 = (string)e1.Field(0).Get();
            //    string s2 = (string)e2.Field(0).Get();
            //    return s1.CompareTo(s2);
            //});
            //Console.WriteLine("======Sort ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Сортируем по-другому
            cell_seqnameid.Root.Sort(e =>
            {
                return((string)e.Field(0).Get());
            });
            Console.WriteLine("======Sort2 ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Посмотрим первые 100
            var qu = cell_seqnameid.Root.Elements().Skip(100).Take(10);

            foreach (var c in qu)
            {
                var v = c.GetValue();
                Console.WriteLine(v.Type.Interpret(v.Value));
            }
            Console.WriteLine("======First 10 after 100. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // поищем чего-нибудь
            string name  = "Марчук Александр Гурьевич";
            var    found = cell_seqnameid.Root.BinarySearchFirst(e =>
            {
                string nm = (string)e.Field(0).Get();
                return(nm.CompareTo(name));
            });
            var f = found.GetValue();

            Console.WriteLine(f.Type.Interpret(f.Value));
            Console.WriteLine("======BinarySearchFirst. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // поищем  по-другому
            string name2  = "марчук";
            var    found2 = cell_seqnameid.Root.BinarySearchFirst(e =>
            {
                string nm = ((string)e.Field(0).Get()).ToLower();
                if (nm.StartsWith(name2))
                {
                    return(0);
                }
                return(nm.CompareTo(name));
            });
            var f2 = found.GetValue();

            Console.WriteLine(f2.Type.Interpret(f2.Value));
            Console.WriteLine("======BinarySearchFirst variant 2. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Поиск всех, удовлетворяющих условию
            string name3  = "белинский";
            var    found3 = cell_seqnameid.Root.BinarySearchAll(e =>
            {
                string nm = ((string)e.Field(0).Get()).ToLower();
                if (nm.StartsWith(name3))
                {
                    return(0);
                }
                return(nm.CompareTo(name3));
            });

            foreach (var ff in found3)
            {
                var f3 = ff.GetValue();
                Console.WriteLine(f3.Type.Interpret(f3.Value));
            }
            Console.WriteLine("======BinarySearchAll ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;

            // Проверка "вручную" правильности поиска всех
            var query = cell_seqnameid.Root.Elements();

            foreach (var rec in query)
            {
                object[] value = (object[])rec.Get();
                string   nam   = ((string)value[0]).ToLower();
                if (nam.StartsWith(name3))
                {
                    Console.WriteLine("{0} {1}", value[0], value[1]);
                }
            }

            Console.WriteLine("======Fin. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now;
            cella.Close();
            cell_seqnameid.Close();
            System.IO.File.Delete(path + "cella.pac");
            System.IO.File.Delete(path + "seqnameid.pxc");
        }