2016-04-15 15 views
1

Ich möchte eine Abfrage erstellen, die nur die Elemente zurückgibt, in denen person1 (David) und person2 (Charles) zusammen angezeigt werden.Eingeschränkt auf SPARQL-Abfrage

Meine Frage ist:

results

Es gibt nur zwei Vorkommen wo person1 und person2 zusammen erscheinen (Programmpunkt 4 und 6):

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".}} 
} 

Mein Ergebnis hier gezeigt wird. Wie kann ich die Abfrage eingrenzen, um zu bekommen, was ich will oder gibt es einen besseren Weg als ich?

+0

Dies ist sehr ähnlich zu [SPARQL in einer Abfrage an eine Kreuzung mit mehreren Werten Angeben] (http://stackoverflow.com/q/36648169/1281433). –

Antwort

3

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 | 
---------------------- 
+0

Vielen Dank für Ihre Antwort und Erklärung. Es war klar und prägnant. –

+0

@JoshuaTaylor: Schön und kompakt wie immer. Noch kompakter: Lassen Sie den leeren Knoten weg und fügen Sie dem Eigenschaftspfad 'sci: firstName' hinzu. Ich meine etwas wie '(sci: hasModerator | sci: hasParticipant | sci: hatGuestofHonor)/sci: firstName'. – AKSW

+0

@aksw das ist ein guter Punkt. Das ist [email protected] für diesen Fall. In der sehr ähnlichen Frage, http://stackoverflow.com/questions/36648169/specifying-an-intersection-with-multiple-values-in-a-sparql-query, gibt es zwei Eigenschaften, die Teilnehmer identifizieren, so dass dieser Ansatz gewonnen hat. Es funktioniert genauso gut. Das hat mich wahrscheinlich hier beeinflusst. –