我是SPARQL的新手,并努力实现这两个目标并需要你的帮助。我有两个类,我分别存储了python和CPP的关键字。现在我打算从这两个集合中找到共同的关键字,以及2之间的区别(意思是,python中存在而不是CPP中的关键字,反之亦然)。我已经尝试过MINUS而不是EXISTS版本的查询但没有帮助。 为了找到2组中的差异,我尝试了以下查询:
SELECT ?subject
WHERE
{ ?subject a python:Keywords.
{ FILTER NOT EXISTS {?subject a cpp:Keywords} }
}
为了找到2组中的常见元素,我尝试了以下查询:
select ?subject
where{ ?subject a python:Keywords. FILTER EXISTS { ?object a cpp:Keywords}
}
他们都没有工作。请帮忙
答案 0 :(得分:1)
SELECT ?subject
WHERE
{ ?subject a python:Keywords .
?subject a cpp:Keywords .
}
应该为您提供常用的关键字。
SELECT ?subject
WHERE
{ ?subject a python:Keywords.
FILTER NOT EXISTS {?subject a cpp:Keywords}
}
应返回python关键字,而不是cpp关键字。
答案 1 :(得分:1)
在您的第一个查询中,问题是您已将过滤器放在另一组括号中。也就是说,你有:
SELECT ?subject
WHERE
{ ?subject a python:Keywords.
{ FILTER NOT EXISTS {?subject a cpp:Keywords} }
}
但应该改为:
SELECT ?subject
WHERE
{ ?subject a python:Keywords.
FILTER NOT EXISTS {?subject a cpp:Keywords}
}
区别很重要,因为第一个是过滤封闭模式的匹配,实际上没有任何效果。
之后,Abecee's answer就是您所需要的。交叉点只是两种类型的东西:
?x a :type1, :type2
,区别在于一种类型但不是另一种类型:
?x a :type1
filter not exists { ?x a :type2 }