在jena sparql中使用Distinct?

时间:2014-07-06 11:19:15

标签: rdf sparql jena

我正在尝试编写SPARQL查询,但没有正确。我想在?x上获得每种类型的一个答案,并且没有?x

的重复值

我认为DISTINCT关键字会这样做,但它不是我的数据,这是我的查询:

SELECT DISTINCT ?x ?ax ?bx ?cx 
WHERE 
{ 
  ?a <SUB:> ?x .
  ?a <DATE:> ?ax .
  ?a <SENDERNAME:> ?bx .
  ?a <MESSAGEID:> ?cx. 
  ?a <REFERENCES:> ?z .
  FILTER regex(?z,'<','i')
} 
LIMIT 30 OFFSET 0

问题是我仍然获得?x

的重复值

如何仅在?x

上应用ditinct

1 个答案:

答案 0 :(得分:0)

SPARQL中的

DISTINCT适用于行而不是变量,因此只要行整体上是不同的,就可以获得一行中一列/多列的重复值。

实现目标的典型方法是使用GROUP BY子句按特定变量对解决方案进行分组 - 在您的情况下为?x - 然后使用SAMPLE()聚合来为您感兴趣的其他列提取样本值,例如

SELECT ?x (SAMPLE(?ax) AS ?date) (SAMPLE(?bx) AS ?sender) (SAMPLE(?cx) AS ?messageID)
WHERE 
{ 
  ?a <SUB:> ?x .
  ?a <DATE:> ?ax .
  ?a <SENDERNAME:> ?bx .
  ?a <MESSAGEID:> ?cx. 
  ?a <REFERENCES:> ?z .
  FILTER regex(?z,'<','i')
}
GROUP BY ?x
LIMIT 30 OFFSET 0

现在,这可能会为您提供您正在寻找的内容,因为您尚未告诉我们有关您的数据的任何详细信息或预期结果应该是什么样的(这样做会大大改善您发布的未来问题)

以上内容为每个?x添加了一行,然后为从?ax?bx?cx中的每一个获取的随机选择的值每个小组。

如果你真正想要做的是拉出不同的主题,然后找到与该主题相关的消息的详细信息,那么你必须使用现有的查询并在代码中手动进行分组,否则你需要制作两个单独的查询 - 一个用于获取不同的主题,另一个用于每个不同的主题以获取与之关联的消息。