2011-05-13 46 views
1

如果我有一个SPARQL查询说,SPARQL中应用了多少次属性?

PREFIX foaf <http://xmlns.com/foaf/0.1/> 
SELECT ?name 
WHERE { 
    ?x foaf:name ?name. 
    ?x foaf:knows ?y. 
} 

选择一些X,谁知道一些y的名字。我怎么能只选择那些确切知道另外3个人(或任何其他人)的人的名字?

此外,作为一个侧面问题 - 这个问题是否有更好的标题?一个用更好的术语来澄清问题?

感谢

+1

是的,标题可能有点混乱。但是如果你不知道聚集的存在,那么我认为这并不坏。最后,在这种情况下,重要的是问题的内容。 – 2011-05-14 08:30:18

+0

@msalvadores谢谢。我不知道这个术语是否适用于SPARQL以及SQL,因此没有。 – Adam 2011-05-14 10:10:14

回答

3

你可以实现与SPARQL 1.1,它的新功能:GROUP BY,HAVING和子查询。像这样的东西可以完成这项工作:

SELECT ?name 
WHERE { 
    ?x foaf:name ?name . 
    { 
     SELECT ?x (count(?y) as ?count_y) WHERE { 
       ?x foaf:knows ?y. 
     } GROUP BY ?x 
     HAVING count(?y) > 3 
    } 
} 

不幸的是,并非所有的SPARQL引擎都支持所有这些功能。我知道Jena/ARQVirtuoso支持他们。

如果您使用的是不支持这些功能,那么我建议运行查询的SPARQL发动机的工作:

SELECT ?name 
WHERE { 
    ?x foaf:name ?name. 
    ?x foaf:knows ?y. 
} 

...和编程计算逻辑,你在需要休息用几行客户端代码查询。

+0

因此,拥有SPARQL 1.1。这是否取决于端点,或我的Jena/ARQ库,或两者? – Adam 2011-05-14 09:30:36

+0

此外,大概这将是==,而不是> – Adam 2011-05-14 09:36:57

+1

@Aidan是的正好3个朋友将其更改为'='(注意单等于SPARQL中的相等)。 SPARQL 1.1支持取决于端点,您是否需要支持它的库取决于该库是否在将查询发送到端点之前解析/验证该查询。如果库不这样做,那么只需要端点支持SPARQL 1.1,因为用于端点对结果进行编码的结果格式看起来完全相同,并且可以由不知道SPARQL 1.1的库进行解释 – RobV 2011-05-14 12:02:05