Jena/Sparql/Arq:在查询期间在模型中注入一些语句



我建立了一个小型的RDF模型:它只包含几个描述人类基因组上某些项目的三元组。

我只想保留那些与某些基因组片段(比如"基因")重叠的项目,这些项目存储在另一个关系数据库中。这个基因数据库太大了,无法插入我最初的RDF模型中。

在查询期间,有没有办法扩展ARQ以在我的模型中注入一些新的语句(描述唯一与项目重叠的基因的RDF语句)?

输入:

uri:object1  my:hasChromosome "chr1" .
uri:object1  my:hasStartPosition "1235689887" .
uri:object1  my:hasEndPosition "2897979879" .
uri:object1  dc:title "my variation" .

输出:

uri:object1  my:hasChromosome "chr1" .
uri:object1  my:hasStartPosition "1235689887" .
uri:object1  my:hasEndPosition "2897979879" .
uri:object1  dc:title "my variation" .
uri:gene1  dc:title "GeneName" .

我已经读过 http://jena.sourceforge.net/ARQ/arq-query-eval.html 但迷路了:我应该选择哪种扩展机制?财产? 网络上有更完整的示例吗?

谢谢

您有两个数据存储。一个是耶拿内存模型中的小型数据集,另一个是关系数据库中的一大组基因相关数据。您希望编写一个 sparql 查询,就好像大型数据集是本地的一样,而无需实际导入它。(您要执行的实际数据转换有点模糊。

在SPARQL 1.1中,你可以在sparql端点之间使用SERVICE关键字来执行此操作。为了能够将基因数据的关系数据库用作SPARQL端点,您需要SPARQL到SQL转换器,例如D2RQ,或者将数据转换为RDF并将其加载到具有SPARQL功能的通用三重存储中。

一旦基因数据在SPARQL终点中可用。

PREFIX my: <...>
PREFIX f:  <java:com.example.DBFunctions.>
INSERT { ?missing a my:Gene } # mark a region as a gene
WHERE {
    ?missing my:hasChromosome ?chr ; 
         my:hasStartPosition ?start ;
         my:hasEndPosition ?end .
    SERVICE<http://localhost:????/gene_data/sparql>{
       ?gene a my:Gene .
         my:hasStartPosition ?gStart ;
         my:hasEndPosition ?gEnd .
       #Detect overlap.
       FILTER( !(?start > ?gEnd || ?end < ?gStart) ) .
    }
}

另一种选择是使用自定义函数执行@user205512所示的筛选器。其中过滤器 java 代码使用 JDBC 连接到关系数据库。

这里的细节有点单薄。从简单开始,使用自定义函数。这将允许您在FILTERs中执行外部查找,或者使用 BIND 检索值。

对于更新,您可能需要考虑SPARQL更新。

最后,你说

我只想保留那些与某些基因组片段(比如"基因")重叠的项目,这些项目存储在另一个关系数据库中。

所以也许像这样:

PREFIX my: <...>
PREFIX f:  <java:com.example.DBFunctions.>
DELETE { ?missing ?p ?o } # Purge the non-overlapping objects
WHERE {
    ?missing my:hasChromosome ?chr ; 
             my:hasStartPosition ?start ;
             my:hasEndPosition ?end .
    FILTER (!f:overlaps(?chr, ?start, ?end)) # true if not overlapping
}

好的,我在这里猜测,但我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新