VDS.RDF.GraphHandler 跳过三元组

VDS.RDF.GraphHandler for skipping Triples

我只想从大约 100 MB 的 rdf cell line ontology 中解析一些数据。到目前为止,我对 1.387.097 个三元组中的 169.796 个感兴趣(跳过了 1.217.301 个三元组)。

我需要大约 24 秒使用下面的处理程序来创建图形。这只比解析 ontology 总共少了几秒钟。

在跳过我不感兴趣的元组方面有什么可以改进的吗?

谢谢!

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);
        }
    }

为了更快地比较节点,您可以尝试直接与从图表创建的 UriNode 进行比较,而不是比较 URI 字符串。如果您在过滤器构造函数中使用 IGraph.CreateUriNode() 方法为 rdfs:subClassOfrdfs: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 处理程序架构中并没有真正解决这个问题的方法。