缩小 SPARQL 查询范围
Narrowing down on SPARQL query
我想查询 returns 只有 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)。我怎样才能缩小查询范围以获得我想要的,或者有比我所做的更好的方法吗?
union 用于表示备选。每次你说 { x } union { y },你要求匹配是否 either x 或 y (或两者)成立。由于您正在寻找涉及两个人(不是任何一个人)的情况,因此您不想使用 union。据我了解,您可以通过三种方式让一个人成为项目的一部分:他们可以是参与者、主持人或贵宾。您可以将其浓缩为:
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person
模式 ?a x|y|z ?b 表示 ?a 连接到 ?b 通过 x、y 或 z.是交替路径。您可以在 SPARQL 1.1 规范 §9 Property Paths.
中阅读有关 属性 路径的更多信息
那么,你希望有两个人,所以:
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person1, ?person2
会给你两个人(或者可能是同一个人,但是当我们检查名字时,我们会强制要求他们有我们想要的名字,这应该要求他们是不同的人,或者至少是一个人有两个名字的人)。模式 ?a p ?b, ?c 表示 ?a 通过 p 与 两者 ?b 和 ?c.
最后,您希望一个人的名字是 Charles,另一个人的名字是 David,所以我们只需要添加
?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 .
prefix sci: <urn:ex:>
select ?item {
?item sci:itemTitle ?title .
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor
[ sci:firstName "Charles" ] ,
[ sci:firstName "David" ] .
}
----------------------
| item |
======================
| sci:ProgrammeItem4 |
| sci:ProgrammeItem6 |
----------------------
我想查询 returns 只有 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)。我怎样才能缩小查询范围以获得我想要的,或者有比我所做的更好的方法吗?
union 用于表示备选。每次你说 { x } union { y },你要求匹配是否 either x 或 y (或两者)成立。由于您正在寻找涉及两个人(不是任何一个人)的情况,因此您不想使用 union。据我了解,您可以通过三种方式让一个人成为项目的一部分:他们可以是参与者、主持人或贵宾。您可以将其浓缩为:
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person
模式 ?a x|y|z ?b 表示 ?a 连接到 ?b 通过 x、y 或 z.是交替路径。您可以在 SPARQL 1.1 规范 §9 Property Paths.
中阅读有关 属性 路径的更多信息那么,你希望有两个人,所以:
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person1, ?person2
会给你两个人(或者可能是同一个人,但是当我们检查名字时,我们会强制要求他们有我们想要的名字,这应该要求他们是不同的人,或者至少是一个人有两个名字的人)。模式 ?a p ?b, ?c 表示 ?a 通过 p 与 两者 ?b 和 ?c.
最后,您希望一个人的名字是 Charles,另一个人的名字是 David,所以我们只需要添加
?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 .
prefix sci: <urn:ex:>
select ?item {
?item sci:itemTitle ?title .
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor
[ sci:firstName "Charles" ] ,
[ sci:firstName "David" ] .
}
----------------------
| item |
======================
| sci:ProgrammeItem4 |
| sci:ProgrammeItem6 |
----------------------