2

我有以下 sparql 查询:

PREFIX spec: <http://rdfs.org/sioc/spec/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX constraint: <http://purl.org/vocab/constraint/constraint#>

SELECT  
(sample(?FName) as ?fName)
(sample(?Midname) as ?midname) 
(sample(?User) as ?user)  

(GROUP_CONCAT(DISTINCT ?userRole;  separator='; ') AS ?UserRole)
WHERE {
    GRAPH <http://example.com/> 
    {
        ?User spec:email ?Email .   
        ?User foaf:firstName ?FirstName .
        ?User foaf:surname ?Midname .
        OPTIONAL
        {
            ?User constraint:containsConstraint ?constraint .               
            ?constraint constraint:constrains ?userRoleUri .
            ?userRoleUri spec:name ?userRole.
        }
FILTER (str(?userRoleUri) IN("http://example.com/roles/admin", "http://example.com/roles/moderator"))

    }
} GROUP BY ?FName  ORDER BY ASC(?FName)

此查询的作用是返回匹配的用户。因此,如果用户“A”列出了 3 个角色:编辑、管理员和版主,它只显示用户的两个角色。像 :

A - Mid - a@abc.om - admin;moderator

我想从查询中做的是:由于用户 A 匹配任何给定的过滤条件,因此应该列出它的所有角色。有没有办法改进这个查询?我也尝试在过滤器中使用子选择和正则表达式,但是:(

在此先感谢 Sparkler

4

3 回答 3

2

关于answers.Sematicweb.com 的建议解决方案在很大程度上解决了问题。这正是我需要的,但是,很有可能。

**答案:** http://answers.semanticweb.com/questions/20016/sparql-filter-get-all-details-of-a-match

谢谢

于 2013-01-18T11:51:25.130 回答
0

首先,我在您的 FILTER 子句中看不到“编辑”角色。关于。显示所有相关角色,为什么不简单地使用以下 SELECT 子句:

SELECT ?FName ?Midname ?userRole

?

于 2012-12-14T10:03:02.090 回答
0

因此,只有当他是管理员或版主时,您才希望拥有用户的角色列表。

在这种情况下,我将添加第二个 userRoleUri。

像这样的东西:

?User constraint:containsConstraint ?constraint .               
?constraint constraint:constrains ?userRoleUri .
?constraint constraint:constrains ?userRoleUri2 .
?userRoleUri2 spec:name ?userRole.

因此,这会在 ?userRoleUri 上过滤您的用户,然后通过 ?userRoleUri2 列出所有 ?userRole

我认为这应该有效。

于 2012-12-14T10:10:32.907 回答