public static void GenerateTripletFlowNt2(string fileName, long limit, sema2012m.Engine engine, sema2012m.LogLine turlog)
        {
            StreamReader sr = new StreamReader(fileName);
            // Начало транзакции ввода
            engine.InitAdapterBuffers();

            //engine.IncludeXElement(xelement);
            XElement xelement = null;
            string current_subject = null;

            long cnt = 0;
            string line = null;
            bool skip = false;
            while ((line = sr.ReadLine()) != null)
            {
                if (cnt > limit) break;     cnt++;
                if (cnt % 1000000 == 0) turlog("Загружено: " + cnt + " линий.");
                if (string.IsNullOrWhiteSpace(line) || line[0] == '@') continue;
                string subject;
                int position = GetEntityOrLiteral(line, 0, out subject);
                if (subject == null) continue;
                string predicate;
                position = GetEntityOrLiteral(line, position, out predicate);
                if (predicate == null) continue;
                string obj;
                bool isObjectProperty = line[position] == '\"' ? false : true;
                position = GetEntityOrLiteral(line, position, out obj);
                if (obj == null) continue;

                if (xelement == null || subject != current_subject)
                {
                    if (!skip && xelement != null) engine.IncludeXElement(xelement);
                    xelement = new XElement(sema2012m.ONames.rdfdescription, new XAttribute(sema2012m.ONames.rdfabout, subject));
                    current_subject = subject;
                }

                if (xelement.Elements().Count() > 100) continue;
                if (isObjectProperty)
                {
                    xelement.Add(new XElement(sema2012m.ONames.GetXName(predicate), new XAttribute(sema2012m.ONames.rdfresource, obj)));
                }
                else // DatatypeProperty
                {
                    xelement.Add(new XElement(sema2012m.ONames.GetXName(predicate), obj)); // пока без языкового спецификатора
                }

            }
            if (!skip && xelement != null) engine.IncludeXElement(xelement);
            // Конец транзакции ввода
            engine.FlushAdapterBuffers();
        }
 public static void GenerateTripletFlowTsv(string fileName, long limit, sema2012m.Engine engine, sema2012m.LogLine turlog)
 {
     engine.InitAdapterBuffers();
     StreamReader sr = new StreamReader(fileName);
     Ntriplets = 0;
     string line;
     while ((line=sr.ReadLine()) != null)
     {
         if (Ntriplets > limit) break;
         if (Ntriplets % 200000 == 0) turlog("Загружено: " + Ntriplets + " триплетов.");
         string[] parts = line.Split('\t');
         if (parts == null || parts.Length < 4) { continue; }
         string subj_ = parts[1];
         string pred_ = parts[2];
         string obj_ = parts[3];
         string subj = ConvertEntityId(subj_.Substring(1, subj_.Length - 2));
         string pred = pred_[0] == '<' ? pred_.Substring(1, pred_.Length - 2) : pred_;
         // Надо бы преобразовать конструкции вида rdfs:label в нормальную форму...
         // Смотрим на объект и определяем вид утверждения
         char c = obj_[0];
         if (c == '<') // объектное свойство
         {
             Ntriplets++;
             //yield return new sema2012m.OProp(subj, pred, obj_.Substring(1, obj_.Length - 2).Replace('\'', '_'));
             engine.AddTripletToBuffer(new sema2012m.OProp(subj, pred,
                 ConvertEntityId(obj_.Substring(1, obj_.Length - 2))));
         }
         else if (c == '\"') // данные
         {
             int pos = obj_.LastIndexOf('\"');
             string lang = null;
             if (pos < obj_.Length - 3 && obj_[pos + 1] == '@')
             {
                 lang = obj_.Substring(pos + 2);
             }
             var dp = new sema2012m.DProp(subj, pred, obj_.Substring(1, pos - 1));
             if (lang != null) dp.lang = lang;
             Ntriplets++;
             //yield return dp;
             engine.AddTripletToBuffer(dp);
         }
         else // неизвестно что
         {
         }
     }
     engine.FlushAdapterBuffers();
 }