Чтобы сделать сравнение узлов немного быстрее, вы можете попробовать сравнить непосредственно с UriNode
, созданным из графика, вместо сравнения строк URI. Если вы используете метод IGraph.CreateUriNode()
в конструкторе фильтров для создания узлов для rdfs:subClassOf
и rdfs:label
, а затем используете IUriNode.Equals()
в качестве компаратора, тогда вы должны обнаружить, что при сравнении узлов можно использовать более быстрое равенство ссылок на объекты, а неСравнение строк.
private class MyHandler : GraphHandler
{
private readonly IUriNode _rdfsSubClassOf;
private readonly IUriNode _rdfsLabel;
public MyHandler(IGraph g)
: base(g)
{
_rdfsSubClassOf = g.CreateUriNode(UriFactory.Create("http://www.w3.org/2000/01/rdf-schema#subClassOf"));
_rdfsLabel = g.CreateUriNode(UriFactory.Create("http://www.w3.org/2000/01/rdf-schema#label"));
}
protected override bool HandleTripleInternal(Triple t)
{
if (t.Predicate is UriNode uri
&& !uri.Equals(_rdfsSubClassOf)
&& !uri.Equals(_rdfsLabel))
{
return true;
}
else if (t.Object is LiteralNode l && l.Language == "zh")
{
return true;
}
return base.HandleTripleInternal(t);
}
}
Однако это только ускорит фильтр, и я подозреваю, что если вы профилируете синтаксический анализ файла, вы обнаружите, что большая часть времени тратится на синтаксический анализ синтаксисасоздайте тройку, которая передается вашему фильтру. На самом деле не существует способа обойти эту проблему в архитектуре обработчика dotNetRDF.