我建立了一个小型的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
}
好的,我在这里猜测,但我希望这有所帮助。