如何构建 N-hop SPARQL (virtuoso) 查询,该查询返回从提供的主题实体开始的所有路径1-N 跳?

问题描述

我正在尝试基于给定的主题实体构建自由库的子图,因为查询完整的自由库所花费的时间太耗时。

我第一次尝试构建 3 跳子图如下:

wiremockServer.Given(Request.Create()
    .WithPath("/some/thing")
    .UsingGet())
    .InScenario("MyScenario")
    .WhenStateIs("Something")
    .WillSetStateto("Started")
    .RespondWith(
        Response.Create()
            .WithStatusCode(500)
            .WithBody("Error"));

这不起作用,因为它忽略了距离主题实体最多 1 跳和 2 跳的所有路径。

我的下一次尝试如下:

PREFIX ns:<http://rdf.freebase.com/ns/>
SELECT ?r0,?e1,?r1,?e2,?r2,?e3 WHERE 
{
    ns:m.034rd ?r0 ?e1.
    ?e1 ?r1 ?e2.
    ?e2 ?r2 ?e3.
}

这也不起作用,尽管我承认不知道为什么或者我是否正确使用了 OPTIONAL 标签

在构建单个 SPARQL 查询失败后,我尝试迭代查询 freebase,并以此构建图形。我尝试了两件事:

(1):

    PREFIX ns:<http://rdf.freebase.com/ns/>
    SELECT ?r0,?e3 WHERE 
    {
        ns:m.034rd ?r0 ?e1.
        OPTIONAL{
            ?e1 ?r1 ?e2.
        }
        OPTIONAL{
        ?e2 ?r2 ?e3.
        }
    }

PREFIX ns:<http://rdf.freebase.com/ns/>
SELECT ?r0,?e1 WHERE 
{
    ns:m.034rd ?r0 ?e1.
}

PREFIX ns:<http://rdf.freebase.com/ns/>
SELECT ?r0,?e2 WHERE 
{
    ns:m.034rd ?r0 ?e1.
    ?e1 ?r1 ?e2.
}

我曾假设这样做会为我提供源自主题实体的所有路径(1-、2- 和 3-跳跃)。

(2) :

PREFIX ns:<http://rdf.freebase.com/ns/>
SELECT ?r0,?e3 WHERE 
{
    ns:m.034rd ?r0 ?e1.
    ?e1 ?r1 ?e2.
    ?e2 ?r2 ?e3.
}

其中 e0 最初设置为主题实体。随后对初始查询返回的每个 e1 运行上述查询。此过程重复 3 次(3-Hops)。

我仍然无法找到构建子图的正确方法,任何帮助将不胜感激。

解决方法

根据评论,我会在这里给出一些建议。提出的问题不适合特定答案。 OpenLink Community Forum 通常比 StackOverflow 更适合深入了解 Virtuoso 等特定产品。

首先,也是最重要的一点,请确保您运行的是最新版本的 Virtuoso,无论是 Open Source Edition (a/k/a VOS),now 7.2.6.1 还是 Enterprise/Commercial Edition (a/k/a VEE or VCE),now 8.3+,两者均于 2021 年 7 月发货。

接下来,查看 basic Performance Tuning settings,并确保将 Virtuoso 设置为按预期使用尽可能多的 RAM 和其他系统资源——因为默认设置旨在最小化 Virtuoso 对系统的负载,不最大化查询或其他性能。

然后,服务器端超时 MaxQueryExecutionTime 在 Virtuoso INI 文件的 [SPARQL] 部分设置为 discussed in the product documentation注意:此超时对通过 iSQL 会话运行的 SPARQL 查询没有影响(它只需要您在前面加上 sparql 关键字,并在您将通过 sparql 表单运行 SPARQL 查询;例如,sparql SELECT ?s ... ORDER BY ?s ;)。

还有一些额外的 Anytime Query settings 可能与针对您的部署调整此功能相关。

如果这些提示不够充分,OpenLink Community Forum 应该是您寻求帮助的下一个停靠点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...