2014-07-06 43 views
0

我想写一个SPARQL查询,但没有得到它的权利。我想获得?x每种类型的一个答案,我想DISTINCT关键字会做的?x在jena sparql中使用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

我该如何才能将ditinct应用于?x

回答

0

DISTINCT SPARQL将应用于行而不是变量,因此,如果整行是不同的,则对于行中的一个/多个列获取重复值是完全有效的。

实现目标的典型方法是使用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从构成每个组的行采取随机选择的值。

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

相关问题