private static void EvaluateMappingbasedProperties(String filename, String lang, Dictionary<string, List<string>> dictExistingNodes, Dictionary<string, uint> dictDirectoryEntries, Ontology thisOntology, Action<string> LogMessage, Action<string> LogError)
{
LogMessage("Begin EvaluateMappingbasedProperties(" + filename + ", " + lang + ")");
try
{
using (StreamReader srNodes = new StreamReader(filename))
{
#region if input stream is empty --> do error handling
if (srNodes == null)
{
LogError("Error reading Nodes file: '" + filename + "'");
return;
}
#endregion
#region init local vars
ODataItem currentDataItem = null;
String strCurrentTriple;
Triple currentTriple;
uint lineCount = 0;
uint updateCount = 0;
#endregion
#region for each triple (line)
while ((strCurrentTriple = srNodes.ReadLine()) != null)
{
#region some debug info
/*
if (lineCount % 1000 == 0)
{
Console.Write(".");
}*/
if (lineCount % 100000 == 0)
{
LogMessage("EvaluateMappingbasedProperties('" + lang + "'): lineCount=" + lineCount + " updateCount=" + updateCount);
GC.Collect();
GC.Collect();
}
lineCount++;
#endregion
currentTriple = NTripleParser.Split(strCurrentTriple, LogError);
#region some sample data for help
/* currentTriple.Subject currentTriple.Predicate currentTriple.TripleObject
<http://dbpedia.org/resource/Alabama> <http://xmlns.com/foaf/0.1/name> "State of Alabama"@en .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/demonym> "Alabamian or Alabaman"@en .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/capital> <http://dbpedia.org/resource/Montgomery%2C_Alabama> .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/largestCity> <http://dbpedia.org/resource/Birmingham%2C_Alabama> .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/areaTotal> "1.35765E11"^^<http://www.w3.org/2001/XMLSchema#double> .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/areaLand> "1.31426E11"^^<http://www.w3.org/2001/XMLSchema#double> .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/areaWater> "4.338E9"^^<http://www.w3.org/2001/XMLSchema#double> .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/maximumElevation> "734.0"^^<http://www.w3.org/2001/XMLSchema#double> .
<http://dbpedia.org/resource/Alabama> <http://dbpedia.org/ontology/minimumElevation> "0.0"^^<http://www.w3.org/2001/XMLSchema#double> .
*/
#endregion
#region clarify __coord> etc. handling
if (currentTriple.Subject.Contains("__"))
{
// TODO find better handling
continue;
}
#endregion
if (currentDataItem == null)
{
#region create new ODataItem
if (CheckExistenceOfVertex(currentTriple.Subject, dictExistingNodes))
// if (!dictInstances.ContainsKey(currentTriple.Subject))
{
// Console.WriteLine("What's wrong here?");
// ignore uninserted data
currentDataItem = new ODataItem(new OClass("0815"));
}
else
{
// string instanceType = dictInstances[currentTriple.Subject];
string instanceType = GetVertexType(currentTriple.Subject, dictExistingNodes, LogError); // qr.FirstOrDefault().GetProperty<long>("TypeID"));
OClass instanceOClass = thisOntology.GetOClass(instanceType);
currentDataItem = instanceOClass.CreateODataItem();
currentDataItem.bToInsert = true;
}
currentDataItem.Subject = currentTriple.Subject;
#endregion
}
else
{
#region multiple rows can be aggregated to a single update statement (as long the currentSubject didn't change)
if (!currentTriple.Subject.Equals(currentDataItem.Subject))
{
#region save previous Instance - EXECUTE QUERY
if (CheckExistenceOfVertex(currentDataItem.Subject, dictExistingNodes)
&& !currentDataItem.IsEmpty())
{
SaveODataItem(currentDataItem, dictExistingNodes, dictDirectoryEntries, lang, LogError);
updateCount++;
}
#endregion
#region re-init all vars for next UPDATE ... #region create new ODataItem
if (!CheckExistenceOfVertex(currentTriple.Subject, dictExistingNodes))
// !dictInstances.ContainsKey(currentTriple.Subject))
{
// Console.WriteLine("What's wrong here?");
// ignore uninserted data
currentDataItem = new ODataItem(new OClass("0815"));
}
else
{
string instanceType = GetVertexType(currentTriple.Subject, dictExistingNodes, LogError); //dictInstances[currentTriple.Subject];
OClass instanceOClass = thisOntology.GetOClass(instanceType);
currentDataItem = instanceOClass.CreateODataItem();
currentDataItem.bToInsert = true;
}
currentDataItem.Subject = currentTriple.Subject;
#endregion
}
#endregion
}
#region temporary workaround - don't insert, when data had not been created before
if (!CheckExistenceOfVertex(currentTriple.Subject, dictExistingNodes)) // !dictInstances.ContainsKey(currentTriple.Subject))
{
continue;
}
#endregion
#region add current line to dictionary (or previously gql-string)
currentDataItem.Add(currentTriple.Predicate, currentTriple.TripleObject);
#endregion
}
#endregion
#region save last line
if (!currentDataItem.IsEmpty())
{
SaveODataItem(currentDataItem, dictExistingNodes, dictDirectoryEntries, lang, LogError);
updateCount++;
}
#endregion
} // using (StreamReader srNodes = new StreamReader(filename))
} // try
catch (Exception e)
{
LogError("Error evaluating " + filename);
LogError(e.Message);
LogError(e.StackTrace);
}
LogMessage("End EvaluateMappingbasedProperties(" + filename + ", " + lang + ")");
}