VDS.RDF.GraphHandler для пропуска тройки - PullRequest
0 голосов
/ 01 октября 2019

Я хочу проанализировать только некоторые данные из онтологии клеточной линии ~ 100 МБ rdf . На данный момент меня интересуют 169,796 из 1.387.097 тройных (1.217.301 пропущенных).

Мне нужно ~ 24 секунды, используя описанный ниже обработчик для создания графика. Это всего на несколько секунд меньше, чем общий анализ онтологии.

Есть ли что-то, что я мог бы улучшить, пропуская интересующие меня кортежи?

Спасибо!

private class MyHandler : VDS.RDF.GraphHandler
    {
        public MyHandler(IGraph g)
            : base(g)
        {
        }

        protected override bool HandleTripleInternal(Triple t)
        {
            if (t.Predicate is UriNode uri 
                && uri.Uri.AbsoluteUri != "http://www.w3.org/2000/01/rdf-schema#subClassOf"
                && uri.Uri.AbsoluteUri != "http://www.w3.org/2000/01/rdf-schema#label")
            {
                return true;
            }
            else if (t.Object is LiteralNode l && l.Language == "zh")
            {
                return true;
            }
            return base.HandleTripleInternal(t);
        }
    }

1 Ответ

0 голосов
/ 01 октября 2019

Чтобы сделать сравнение узлов немного быстрее, вы можете попробовать сравнить непосредственно с 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.

...