2
我将用户定义的查询转换为SPARQL。例如,当用户说“abc”时,它意味着给我一个给定类型的所有节点,它们有一些名为“abc”的属性。作为这个的扩展,如果用户说“abc或(pqr和lmn)”,我需要找到某个属性为“abc或(pqr和lmn)”的给定类型的所有节点。以下是我已经提出的查询:使用SPARQL查询进行联合和交集
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
但它不会返回正确的结果。上述查询有问题吗?我不想使用以下内容,因为我需要动态生成条件,并且每个子句都需要分开。
FILTER (regex(str(?obj2), 'abc', "i") || regex(str(?obj2), 'pqr', "i") && regex(str(?obj2), 'lmn', "i"))
我不明白你为什么不与一个大'FILTER'使用第二种方法。它更简单,它的工作原理。 – cygri 2012-04-13 20:49:45
每个术语可能会更复杂,使得{}的主体更大,并且这些术语将与这些基本案例混合在一起。 FILTER只适用于这种情况。 – 2012-04-13 23:26:02
另外,我发现上面的查询不适用于Redland。然后我尝试安装ARQ,并对其进行处理。所以,它可能与那个特定的实现有关。 – 2012-04-13 23:28:10