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

Jena/Sparql/Arq:在查询期间在模型中注入一些语句,sparql,jena,bioinformatics,bigdata,arq,Sparql,Jena,Bioinformatics,Bigdata,Arq,我建立了一个小的RDF模型:它只包含几个描述人类基因组中某些项目的三元组 我只想保留那些与某些基因组片段重叠的项目,比如存储在另一个关系数据库中的基因。这个基因数据库太大,无法插入我最初的RDF模型 有没有办法扩展ARQ来注入一些新的语句——RDF语句,描述在查询过程中与我的模型中的项重叠的唯一基因 输入: uri:object1 my:hasChromosome "chr1" . uri:object1 my:hasStartPosition "1235689887" . uri:obje

我建立了一个小的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" .
我已经读过,但我迷路了:我应该选择哪种扩展机制?所有物网络上还有更完整的例子吗


谢谢,

这里的详细信息有点少。从简单开始,使用。这将允许您在过滤器中进行外部查找,或者使用检索值

更新,您可能需要考虑。

最后,你说

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

因此,也许类似于:

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
}

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

这里的详细信息有点少。从简单开始,使用。这将允许您在过滤器中进行外部查找,或者使用检索值

更新,您可能需要考虑。

最后,你说

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

因此,也许类似于:

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
}

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

您有两个数据存储。一个是Jena记忆模型中的小数据集,另一个是关系数据库中的一大组基因相关数据。您希望编写sparql查询,就像大型数据集是本地的一样,而不实际导入它。您想要进行的实际数据转换有点模糊

在SPARQL 1.1中,您可以在SPARQL端点之间使用SERVICE关键字来执行此操作。为了能够将基因数据的关系数据库用作SPARQL端点,您需要一个SPARQL到SQL转换器,例如,或将数据转换为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连接到关系数据库。

您有两个数据存储。一个是Jena记忆模型中的小数据集,另一个是关系数据库中的一大组基因相关数据。您希望编写sparql查询,就像大型数据集是本地的一样,而不实际导入它。您想要进行的实际数据转换有点模糊

在SPARQL 1.1中,您可以在SPARQL端点之间使用SERVICE关键字来执行此操作。为了能够将基因数据的关系数据库用作SPARQL端点,您需要一个SPARQL到SQL转换器,例如,或将数据转换为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连接到关系数据库。

我知道如何创建自定义函数,但这不是我需要的。正如我所说的,我想注入一些不属于初始RDF模型的新语句。基因的数据将存储在其他地方,而不是RDF数据存储中。啊,我想我完全误解了。当你说injectsomenewstatements时,你的意思是什么使查询的模型看起来是rdf model+关系数据库中的东西?我知道如何创建自定义函数,但这不是我需要的。正如我所说的,我想注入一些不属于初始RDF模型的新语句。基因的数据将存储在其他地方,而不是RDF数据存储中。啊,我想我完全误解了。当你说injectsomenewstatements时,你的意思是什么使查询的模型看起来是rdf模型+关系数据库中的东西?尝试SPARQL更新而不是ARQ。另外,你正在查看旧的Jena站点。Jena现在是一个Apache项目:尝试SPARQL更新而不是ARQ。另外,您正在查看旧Jena站点。Jena现在是一个Apache项目: