我正在将用户定义的查询转换成SPARQL。例如,当用户说“abc”时,它意味着给我所有具有名为“abc”的某些属性的给定类型的节点。作为此的扩展,如果用户说“abc或(pqr和lmn)”,我需要查找所有给定类型的节点,其中某个属性为“abc或(pqr和lmn)”。以下是我想出来的查询:
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"))