【问题标题】:Jena/Sparql/Arq: injecting some statements in the model during the queryJena/Sparql/Arq:在查询期间在模型中注入一些语句
【发布时间】:2012-09-19 17:54:16
【问题描述】:

我建立了一个小型 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 jena bioinformatics bigdata arq


【解决方案1】:

您有两个数据存储。一个是 Jena 内存模型中的一个小数据集,一个是关系数据库中的一大组基因相关数据。您想编写一个 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连接关系型数据库。

【讨论】:

    【解决方案2】:

    这里的细节有点薄。从简单的开始,使用custom function。这将允许您在 FILTERs 中进行外部查找,或者使用 BIND 检索值。

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

    最后,你说

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

    所以也许是这样的:

    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
    }
    

    好的,我猜到这里了,但我希望能有所帮助。

    【讨论】:

    • 我知道创建自定义函数 (plindenbaum.blogspot.fr/2008/11/…) 但这不是我需要的。正如我所说,我想注入一些不属于初始 RDF 模型的新语句。 “基因”的数据将存储在其他地方,而不是 RDF 数据存储中。
    • 啊,我想我完全误解了。当您说“注入一些新语句”时,您的意思是“使查询的模型看起来是 rdf 模型 + 与 db 相关的东西”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多