SPARQL 查询在 Fuseki 中有效,但在 Jena TDB 中无效

2024-05-11

我将数据组织在多个图表中。保存三元组的图表很重要。数据结构很复杂,但可以简化如下:

我的商店包含蛋糕,其中有不同蛋糕类型的层次结构,所有子类<cake>

<http://example.com/a1> a <http://example.com/applecake>
<http://example.com/a2> a <http://example.com/rainbowcake>
...

根据用户在 UI 中创建它们的方式,它们最终会出现在不同的图表中。例如,如果用户“烤”了一个蛋糕,它就会进入<http://example.com/homemade>图表,如果他们“购买”一个,它就会进入<http://example.com/shopbought> graph.

当我从商店取回蛋糕时,我想知道每个蛋糕是自制的还是商店购买的。没有这方面的属性,我想纯粹根据存储三元组的图形来检索信息。

我尝试了各种方法来实现这一目标,但没有一个在耶拿 TDB 中起作用。问题是所有蛋糕都以“商店购买”的形式返回。然而,所有查询都可以在 Fuseki 中工作(在确切的 sae 数据集上),我想知道这是否是 TDB 错误或者是否有其他方法。以下是简化的查询(没有变化):

版本1:

SELECT DISTINCT  *
FROM <http://example.com/homemade>
FROM <http://example.com/shopbought>
FROM NAMED <http://example.com/homemade>
FROM NAMED <http://example.com/shopbought>
WHERE {
    ?cake rdf:type ?caketype .
    ?caketype rdfs:subClassOf* <cake>
      {
          GRAPH <http://example.com/homemade> { ?cake rdf:type ?typeHomemade }
      } UNION {
          GRAPH <http://example.com/shopbought> { ?cake rdf:type ?typeShopbought }
      }
    BIND(str(if(bound(?typeHomemade), true, false)) AS ?homemade)
}

版本2:

SELECT DISTINCT  *
    FROM <http://example.com/homemade>
    FROM <http://example.com/shopbought>
    FROM NAMED <http://example.com/homemade>
    FROM NAMED <http://example.com/shopbought>
    WHERE {
        ?cake rdf:type ?caketype .
        ?caketype rdfs:subClassOf* <cake>
        GRAPH ?g {
          ?cake rdf:type ?caketype .
        }
        BIND(STR(IF(?g=<http://example.com/homemade>, true, false)) AS ?homemade)
    }

有什么想法为什么这在 Fuseki 中有效但在 TDB 中无效?

Edit:我开始认为这与 GRAPH 关键字有关。以下是一些更简单的查询(适用于 Fuseki 和 tdbquery)以及我使用 Jena API 获得的结果:

SELECT * WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}

0 个结果

SELECT * WHERE { GRAPH ?g { ?s ?p ?o }}

0 个结果

SELECT * FROM <http://example.com/homemade> WHERE { ?s ?p ?o }

x 结果

SELECT * FROM <http://example.com/homemade> WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}

0 个结果

SELECT * FROM NAMED <http://example.com/homemade> WHERE { GRAPH <http://example.com/homemade> { ?s ?p ?o }}

0 个结果


好的,我的解决方案实际上与我执行查询的方式有关。我最初的想法是预过滤数据集,以便仅在相关图上执行查询(数据集包含许多图,并且它们可能非常大,这会使查询“所有内容”变慢)。这可以通过将它们添加到 SPARQL 或直接在 Jena 中来完成(尽管这不适用于其他三元组存储)。然而,将两种方法结合起来“为了安全起见”是行不通的。

此查询在整个数据集上运行并按预期工作:

Query query = QueryFactory.create("SELECT * WHERE { GRAPH ?g { ?s ?p ?o } }", Syntax.syntaxARQ);
QueryExecution qexec = QueryExecutionFactory.create(query, dataset);
ResultSet result = qexec.execSelect();

相同的查询只能在特定的图上执行,无论是哪个图,它都不会给出任何结果:

//run only on one graph
Model target = dataset.getNamedModel("http://example.com/homemade");
//OR run on the union of all graphs
Model target = dataset.getNamedModel("urn:x-arq:UnionGraph");
//OR run on a union of specific graphs
Model target = ModelFactory.createUnion(dataset.getNamedModel("http://example.com/shopbought"), dataset.getNamedModel("http://example.com/homemade"), ...);
[...]
QueryExecution qexec = QueryExecutionFactory.create(query, target);
[...]

我的解决方法是现在始终查询整个数据集(它很好地支持 SPARQL GRAPH 关键字),并且对于每个查询始终指定应运行的图形,以避免查询整个数据集。 不确定这是否是耶拿 API 的预期行为

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPARQL 查询在 Fuseki 中有效,但在 Jena TDB 中无效 的相关文章

  • 基于 SParQL 中的 URI 进行过滤 [重复]

    这个问题在这里已经有答案了 您可以在以下位置运行以下查询链接 MDB SPARQL 资源管理器 http www linkedmdb org snorql 的价值观 imdbID 最后一个变量 包含来自三个可能域 freebase com
  • Fuseki 1.0.1 SPARQL 更新返回 404

    我正在尝试学习更新 Fuseki 中的数据 但当我尝试时出现 404 错误 我显然没有做正确的事情 也许这是我的 INSERT 命令 不过我已经尝试过很多了 我正在使用 sparql tpl 上基于 Web 的 SPARQL 界面 我可以让
  • 如何将 SPARQL 发布到 Virtuoso?

    我正在使用两种不同的HTTP POST公用事业 poster https addons mozilla org en US firefox addon poster 从 Firefox 以及Python requests http docs
  • 计算OWL本体中子类的深度

    我正在寻找一个 SPARQL 查询 它可以返回 OWL 层次结构中指定子类的位置 我研究了几个例子 但我能达到的最好结果是计算指定超类与其子类之间的相对路径 感谢约书亚 泰勒 https stackoverflow com a 230949
  • 使用TDB2和OWL Reasoner配置fuseki

    这里是 fusioni jena 的新手 我设法让 fusioni 使用 tdb1 与 OWLFBRuleReasoner 一起运行没有问题 但无法使其与 tdb2 一起工作 http jena apache org 2016 tdb ht
  • 如何获取维基百科根类别的终端叶子

    我只想获取维基百科类别的叶子 但不知道如何获取 我可以得到所有的叶子 SELECT subcat WHERE subcat skos broader category Buildings and structures in France b
  • RDF 读取/解析错误

    我有一些 RDF 文件 我想将其导入到 tripplestore AllegroGraph 中 但在第一个文件中 我收到 SAX 解析器错误 指出存在无法识别的字符 删除有问题的行后 一切都很好 然后我尝试使用 W3C RDF 验证器和带有
  • 列出来自 DBpedia 的国家

    尝试查询 DBpedia 以获取包含以下内容的所有国家 地区的列表dbo longName列出每个国家的财产和首都 但返回 0 个结果 看不出查询有什么问题 PREFIX dbo
  • 为 RDBMS(MySQL 数据库)创建 SPARQL 端点的最佳方法

    我正在 想做 一些链接开放数据集的实验 特别是政府推出的实验 我有一个 RDBMS 更具体地说是 MySQL 我设计它时考虑了语义网络的想法 即我将信息存储为对象 谓词和定义对象的类 反过来 所有对象通过主语 gt 谓词 gt 宾语形式的语
  • sparql 主题的完整树

    例如 当我有一个人图时 例如约翰和约翰有工作地址 家庭地址 电话号码 关系等 是否有可能在不知道它是什么的情况下检索与 john 及其子类相关的所有内容 这样我就可以检索例如以下内容 John lt address lt house num
  • 通过SPARQL UPDATE从本体中删除空白节点

    我在 SPARQL UPDATE 插入 操作的帮助下将一些数据存储在 protege 中制作的本体模型中 以下是更新查询 PREFIX test
  • 使用 rdflib-sqlalchemy 的 SPARQL 查询性能

    我有 7200 个左右的 SKOS Concept 对象 由 rdflib sqlalchemy 通过解析存储在 Postgres DB 中的海龟文件创建 以下 SPARQL 查询需要 30 多秒才能响应数据 SELECT subject
  • 用于查找艺术家属性的 dbpedia SPARQL 查询

    我试图通过 DBPedia 和 SPARQL 查询语言获取有关艺术家的详细信息 但是 根据我的理解 如何获取某些信息似乎几乎是不可能的 我正在尝试找到一位艺术家并获取诸如他们的家乡之类的信息 我猜查询应该类似于 SELECT c WHERE
  • 如何返回从起始资源到指定路径深度的所有 S->P->O 三元组?

    我的目标是以图形方式表示指定资源的深度两条边内的 S gt P gt O 关系 p Person 1 我希望从查询中返回该路径长度内的所有关系 s p o在我的图形应用程序中进行进一步处理 我尝试了下面的第一个查询 它给了我第一组 s p
  • 根据 URI 前缀从 DBpedia SPARQL 查询中排除结果

    使用时如何排除一组概念DBpedia SPARQL 端点 http dbpedia org sparql 我使用以下基本查询来获取概念列表 SELECT DISTINCT concept WHERE x a concept LIMIT 10
  • SPARQL 为缺失字段生成值

    我正在尝试编写一个 SELECT 它为我提供表中的所有值 我有可选值 我希望用标准值填充它们 如果它们不存在 这是我的代码 SELECT WHERE a nmo hasObject nm coin OPTIONAL a nmo hasAut
  • SPARQL:如何将 owl:equivalentClass 传输到 rdfs:subClassOf (owl:Restriction) 属性?

    我的问题是关于使用 SPARQL 查询一些 owl 本体 其中owl Restrictions被大量使用 在我的例子中 这是 细胞本体论 http obofoundry org ontology cl html 以下是一些典型条目的示例 以
  • 如何以 JSON-LD 返回 SPARQL 结果?

    返回 SPARQL 查询结果的好方法是什么JSON LD http www w3 org TR 2014 REC json ld 20140116 最好靠近标准化 JSON 格式 http www w3 org TR 2013 REC sp
  • SPARQL 查询以获取定义了命名空间前缀的所有类标签

    我想获取存储在芝麻存储库中的所有类 这是我的查询 SELECT class classLabel WHERE class rdf type rdfs Class class rdfs label classLabel 它返回带有标签的类的所
  • Sparql 查询子类或等效项

    我想查询尼古丁 产品 的所有子类 结果一定是 鼻腔形式尼古丁 口咽形式尼古丁 4项 参见图片 我尝试通过 rdfs subClassOf 和 owl equivalentClass 查询 但没有成功 尝试从这个例子 https stacko

随机推荐