union ist für den Ausdruck von Alternativen. Jedes Mal, wenn Sie sagen {x} Vereinigung {y}, sind Sie für die Spiele zu fragen, ob entwederx oder y (oder beides) zu halten. Da Sie nach Fällen suchen, in denen beide Personen beteiligt sind (keine Person), möchten Sie nicht union verwenden. Wie ich es verstehe, haben Sie drei Möglichkeiten, wie eine Person Teil eines Gegenstands sein kann: Sie kann ein Teilnehmer, ein Moderator oder ein Ehrengast sein. Sie können das in kondensieren:???
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person
Das Muster ax | y | z b sagt, dass ein zu b von beidenx, verbunden ist y, oder z. Es ist ein alternativer Weg. Weitere Informationen zu Eigenschaftenpfaden finden Sie in der SPARQL 1.1-Spezifikation §9 Property Paths.
Dann wollen Sie es zwei Menschen sein, so:
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor ?person1, ?person2
werden Sie zwei Leute (oder möglicherweise die gleiche Person, aber wenn wir für Namen überprüfen, werden wir erzwingen, dass sie haben Sie die Namen, die wir wollen, die sie erfordern, unterschiedliche Leute zu sein, oder mindestens eine einzelne Person mit zwei Vornamen). Das Muster ? A p? B,? C sagt, dass ? A von p zu beide? B und ? C zusammenhängt.
Schließlich wollen Sie eine Person den Vornamen Charles und den anderen David haben, so brauchen wir nur
?person1 sci:firstName "Charles" .
?person2 sci:firstName "David" .
hinzufügen Da Sie eigentlich nicht die Werte von mit? Person1 und ? person2 für alles andere können Sie auch einfach einen leeren Knoten hier verwenden. Zum Beispiel
?item sci:hasModerator|sci:hasParticipant|sci:hasGuestofHonor [ sci:firstName "Charles" ] , [ sci:firstName "David" ] .
Mal sehen, wie alles zusammenpasst. Ich habe einige Beispieldaten basierend auf den Ergebnissen erstellt, die Sie gezeigt haben.Offensichtlich ist es nicht dasselbe wie Ihre Daten, aber es hat genug, um die Ergebnisse, die Sie gezeigt haben, zu reproduzieren und zu demonstrieren, wie das funktioniert.
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 |
----------------------
Dies ist sehr ähnlich zu [SPARQL in einer Abfrage an eine Kreuzung mit mehreren Werten Angeben] (http://stackoverflow.com/q/36648169/1281433). –