缩小SPARQL查询的范围

缩小SPARQL查询的范围,sparql,rdf,owl,ontology,Sparql,Rdf,Owl,Ontology,我想做一个查询,只返回person1(David)和person2(Charles)同时出现的项目 我的问题是: SELECT ?item ?par ?mod ?hon ?firstName ?lastName WHERE { ?item sci:itemTitle ?title. {?item sci:hasParticipant ?par. {?par sci:firstName "Charles".}UNION{?par sci:firstName "David".}}

我想做一个查询,只返回person1(David)和person2(Charles)同时出现的项目

我的问题是:

SELECT ?item ?par ?mod ?hon ?firstName ?lastName
WHERE {
    ?item   sci:itemTitle ?title.
    {?item sci:hasParticipant ?par. {?par sci:firstName "Charles".}UNION{?par sci:firstName "David".}} 
    UNION {?item sci:hasModerator ?mod. {?mod sci:firstName "Charles".}UNION{?mod sci:firstName "David".}} 
    UNION {?item sci:hasGuestOfHonor ?hon. {?hon sci:firstName "Charles".}UNION{?hon sci:firstName "David".}}
}
我的结果如下所示:


只有两次person1和person2同时出现(计划项目4和6)。我如何缩小查询范围以获得我想要的内容,或者有没有比我所做的更好的方法

联合用于表达备选方案。每次你说{x}union{y},你都在要求匹配,无论是x还是y(或两者)都有效。因为您要查找两个人都参与的案例(不是任何一个人),所以不希望使用联合。据我所知,一个人可以通过三种方式参与某个项目:他们可以是参与者、主持人或贵宾。您可以将其浓缩为:

?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person
模式?a x | y | z?b表示?a通过xyz连接到?b。这是一条交替的道路。您可以阅读SPARQL 1.1规范中有关属性路径的更多信息

然后,你希望有两个人,所以:

?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person1, ?person2
将得到两个人(或者可能是同一个人,但当我们检查姓名时,我们将强制他们拥有我们想要的姓名,这要求他们是不同的人,或者至少一个人有两个名字)。模式?a p?b,表示?apc相关

最后,你希望一个人的名字是查尔斯,另一个是大卫,所以我们只需要加上

?person1 sci:firstName "Charles" .
?person2 sci:firstName "David" .
由于实际上没有将?person1?person2的值用于任何其他内容,因此也可以在此处使用空白节点。例如:

?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor [ sci:firstName "Charles" ] ,  [ sci:firstName "David" ] .
让我们看看这一切是如何结合在一起的。我根据您显示的结果创建了一些示例数据。显然,它与您的数据不同,但它足以重现您显示的结果,并演示其工作原理

prefix sci: <urn:ex:>

sci:Male_Person2 sci:firstName "David" .
sci:Male_Person3 sci:firstName "Charles" .

sci:ProgrammeItem1 sci:itemTitle "" ;
                   sci:hasParticipant sci:Male_Person3 ;
                   sci:hasModerator sci:Male_Person3 .
sci:ProgrammeItem3 sci:itemTitle "" ;
                   sci:hasParticipant sci:Male_Person2 ;
                   sci:hasModerator sci:Male_Person2 .
sci:ProgrammeItem4 sci:itemTitle "" ;
                   sci:hasParticipant sci:Male_Person3 ;
                   sci:hasModerator sci:Male_Person2 .
sci:ProgrammeItem6 sci:itemTitle "" ;
                   sci:hasParticipant sci:Male_Person2, sci:Male_Person3 .

这与非常相似。谢谢您的回答和解释。它清晰而简洁。@JoshuaTaylor:像往常一样漂亮而紧凑。更紧凑:省略空白节点并向属性路径添加代码> SCI:FieldNeX/Cuff>。我的意思是类似于
(sci:hasModerator | sci:hasParticipant | sci:hasGuestofornor)/sci:firstName
@aksw这是一个很好的观点。那个whitejs@clarkson.edu对于这个案子。在非常相似的问题中,有两个属性标识参与者,因此这种方法不会很好地工作。这可能影响了我。