Rdf 使用SPARQL查询的并集和交集
我正在将用户定义的查询转换为SPARQL。例如,当用户说“abc”时,它意味着给我一个给定类型的所有节点,这些节点都有一个名为“abc”的属性。作为扩展,如果用户说“abc or(pqr和lmn)”,我需要找到某个属性为“abc or(pqr和lmn)”的给定类型的所有节点。以下是我提出的问题:Rdf 使用SPARQL查询的并集和交集,rdf,sparql,jena,arq,redland,Rdf,Sparql,Jena,Arq,Redland,我正在将用户定义的查询转换为SPARQL。例如,当用户说“abc”时,它意味着给我一个给定类型的所有节点,这些节点都有一个名为“abc”的属性。作为扩展,如果用户说“abc or(pqr和lmn)”,我需要找到某个属性为“abc or(pqr和lmn)”的给定类型的所有节点。以下是我提出的问题: SELECT DISTINCT ?node, ?type WHERE
SELECT DISTINCT ?node, ?type
WHERE
{
{
?node a ?type .
FILTER ( ?type != <sometype>)
}
{
{
?node ?reln0 ?obj0 .
FILTER ( regex(str(?obj0), 'abc', "i") )
}
UNION
{
{
?node ?reln1 ?obj1 .
FILTER ( regex(str(?obj1), 'pqr', "i") )
}
{
?node ?reln2 ?obj2 .
FILTER ( regex(str(?obj2), 'lmn', "i") )
}
}
}
}
ORDER BY ?node
我将您的查询具体化如下(为第一个过滤器输入一个确定的类型): 使用
roqet
:
$ roqet query.sparql -D data.n3 -r table
roqet: Querying from file query.sparql
--------------------------------------------------------------
| node | type |
==============================================================
| uri<http://example.org/n1> | uri<http://example.org/Type2> |
| uri<http://example.org/n3> | uri<http://example.org/Type2> |
--------------------------------------------------------------
$ roqet -v
0.9.28
$roqet query.sparql-D data.n3-r表
roqet:从文件query.sparql进行查询
--------------------------------------------------------------
|节点类型|
==============================================================
|uri | uri|
|uri | uri|
--------------------------------------------------------------
$roqet-v
0.9.28
我不明白您为什么不在一个大的过滤器上使用第二种方法。每一个术语都可能更复杂,使得{}的主体更大,这些术语将与这些基本情况混合在一起。过滤器只适用于这种情况。而且,我发现上面的查询在Redland上不起作用。然后我尝试安装ARQ,它成功了。所以,它可能与特定的实现有关。你所说的“不返回正确的结果”是什么意思?你使用了什么版本的Redland库(和ARQ)?我得到的结果似乎是“适当的”。你能给我们看看你处理的数据吗?
PREFIX : <http://example.org/>
SELECT DISTINCT ?node ?type
WHERE
{
{
?node a ?type .
FILTER ( ?type != :Type1 )
}
{
{
?node ?reln0 ?obj0 .
FILTER ( regex(str(?obj0), 'abc', "i") )
}
UNION
{
{
?node ?reln1 ?obj1 .
FILTER ( regex(str(?obj1), 'pqr', "i") )
}
{
?node ?reln2 ?obj2 .
FILTER ( regex(str(?obj2), 'lmn', "i") )
}
}
}
}
ORDER BY ?node
@prefix : <http://example.org/> .
:n1 a :Type2 ; # keep
:r0 :NodeABC .
:n2 a :Type2 ;
:r0 :NodeBCD .
:n3 a :Type2 ; # keep
:r1 :NodePQR ;
:r2 :NodeLMN .
:n4 a :Type2 ;
:r1 :NodeQRS ;
:r2 :NodeLMN .
:n5 a :Type2 ;
:r1 :NodePQR ;
:r2 :NodeMNO .
:n6 a :Type2 ;
:r1 :NodeQRS ;
:r2 :NodeMNO .
$ arq --data data.n3 --query query.sparql
-----------------
| node | type |
=================
| :n1 | :Type2 |
| :n3 | :Type2 |
-----------------
$ arq --version
Jena: VERSION: 2.10.0
Jena: BUILD_DATE: 2013-02-20T12:04:26+0000
ARQ: VERSION: 2.10.0
ARQ: BUILD_DATE: 2013-02-20T12:04:26+0000
$ roqet query.sparql -D data.n3 -r table
roqet: Querying from file query.sparql
--------------------------------------------------------------
| node | type |
==============================================================
| uri<http://example.org/n1> | uri<http://example.org/Type2> |
| uri<http://example.org/n3> | uri<http://example.org/Type2> |
--------------------------------------------------------------
$ roqet -v
0.9.28