[TASK] Generic commit.
This commit is contained in:
parent
402fda4b30
commit
0326c1038d
@ -708,7 +708,7 @@ f:timestamp(?s,rdf:type,<http://example.org/type/A>)
|
||||
\begin{lstlisting}
|
||||
BIND(f:timestamp(?a,?b,?c) - f:timestamp(?x,?y,?z)) AS ?difference)
|
||||
\end{lstlisting}
|
||||
\item \textbf{Eventuell vorhandene Tripel selektieren}: Manchmal kann man zur Zeit der Formulierung einer Abfrage nicht mit vollständiger Gewissheit eine Aussage darüber treffen, ob bestimmte Muster von Tripeln in den zur Verfügung stehenden Daten enthalten sind. In diesem Fall hilft das Konstrukt \texttt{OPTIONAL \{ ... \}} weiter: Es erlaubt die Selektion von Tripeln, wobei der Fall, dass keine Tripel selektiert werden konnten keinen negativen Einfluss auf die restliche Abfrage hat. Möchte man beispielsweise das Tripelmuster \texttt{?a :b :c} selektieren und zusätzlich --- falls vorhanden --- die Tripel für das Muster \texttt{?d :e :f}, so kann dies in der \texttt{WHERE}-Klausel wie folgt notiert werden:
|
||||
\item \textbf{Eventuell vorhandene Tripel selektieren}: Manchmal kann man zur Zeit der Formulierung einer Abfrage nicht mit vollständiger Gewissheit eine Aussage darüber treffen, ob bestimmte Muster von Tripeln in den zur Verfügung stehenden Daten enthalten sind. In diesem Fall hilft der \texttt{OPTIONAL \{ ... \}}-Block weiter: Er erlaubt die Selektion von Tripeln, wobei der Fall, dass keine Tripel selektiert werden konnten keinen negativen Einfluss auf die restliche Abfrage hat. Möchte man beispielsweise das Tripelmuster \texttt{?a :b :c} selektieren und zusätzlich --- falls vorhanden --- die Tripel für das Muster \texttt{?d :e :f}, so kann dies in der \texttt{WHERE}-Klausel wie folgt notiert werden:
|
||||
\begin{lstlisting}
|
||||
WHERE {
|
||||
?a :b :c .
|
||||
@ -718,15 +718,43 @@ WHERE {
|
||||
}
|
||||
\end{lstlisting}
|
||||
Wurde durch die Abfrage kein Tripel für \texttt{?d :e :f} gefunden, so wird dennoch das Ergebnis für \texttt{?a :b :c} zurückgegeben.
|
||||
\item \textbf{Variablen auf Werte prüfen}: Hat man das Konstrukt \texttt{OPTIONAL \{ ... \}} verwendet, so stellt sich innerhalb der restlichen Abfrage oft die Frage, ob nun ein Ergebnis vorliegt oder nicht. Über die Abfrage \texttt{ISBOUND(?var)} kann geprüft werden, ob die angegebene Variable --- in diesem Fall \texttt{?var} --- mit einem Wert versehen ist oder nicht.
|
||||
\item \textbf{Abwesenheit von Tripeln erkennen}: \texttt{FILTER NOT EXISTS \{ ... \}}
|
||||
\item \textbf{Gefundene Tripelmenge einschränken}: \texttt{FILTER()}
|
||||
|
||||
\item \textbf{Variablen auf Werte prüfen}: Hat man den \texttt{OPTIONAL \{ ... \}}-Block verwendet, so stellt sich innerhalb der restlichen Abfrage oft die Frage, ob nun ein Ergebnis vorliegt oder nicht. Über die Abfrage \texttt{ISBOUND(?var)} kann geprüft werden, ob die angegebene Variable --- in diesem Fall \texttt{?var} --- mit einem Wert versehen ist oder nicht.
|
||||
\item \textbf{Gefundene Tripelmenge einschränken}: Hat man bereits Tripel selektiert und möchte die Ergebnismenge anhand von feineren Kriterien einschränken, so kommt \texttt{FILTER(\emph{bedingung})} zum Einsatz. Die Anweisung nimmt einen Ausdruck als Bedingung entgegen, die für alle gefundenen Tripel ausgewertet wird. Erfüllen gefundene Tripel die Bedingung, so bleiben sie in der Ergebnismenge.
|
||||
Gegeben seien Tripel nach dem Schema:
|
||||
\begin{lstlisting}
|
||||
?person rdf:type :person .
|
||||
?person :isOfAge ?someAge .
|
||||
\end{lstlisting}
|
||||
Um aus diesen Daten nun alle Personen zu selektieren, die über 18 sind, kann die \texttt{FILTER}-Anweisung in der \texttt{WHERE}-Klausel verwendet werden:
|
||||
\begin{lstlisting}
|
||||
WHERE {
|
||||
?person rdf:type :person .
|
||||
?person :isOfAge ?age .
|
||||
FILTER(?age >= 18)
|
||||
}
|
||||
\end{lstlisting}
|
||||
Das Ergebnis enthält dann nur noch Personen, die laut ihrer Altersangabe älter als 18 sind.
|
||||
\item \textbf{Abwesenheit oder Präsenz von Tripeln erkennen}: Unter bestimmten Umständen kann es notwendig sein, die Abwesenheit von Tripeln als Kriterium für ein Ergebnis festzulegen. Hiefür kann der Block \texttt{FILTER NOT EXISTS \{ ... \}} eingesetzt werden. Ähnlich wie der \texttt{OPTIONAL}-Block nimmt er Tripelmuster entgegen. Jedoch stellen alle in ihm gefundenen Tripel das Ausschlusskriterium für die zu ihnen bezogene Tripel aus der restlichen Ergebnismenge dar. Ein Beispiel aus \cite{w3c:sparql}[Kapitel 8.1.1] zeigt dies sehr schön. Gegeben seien folgende Daten:
|
||||
\begin{lstlisting}
|
||||
:alice rdf:type foaf:Person .
|
||||
:alice foaf:name "Alice" .
|
||||
:bob rdf:type foaf:Person .
|
||||
\end{lstlisting}
|
||||
Möchte man nun alle Personentripel finden, zu denen \textbf{kein} Name via \texttt{foaf:name} angegeben ist, so führt die folgende Abfrage zum gewünschten Ergebnis und gibt \texttt{:bob} als Ergebnis zurück:
|
||||
\begin{lstlisting}
|
||||
SELECT ?person
|
||||
WHERE {
|
||||
?person rdf:type foaf:Person .
|
||||
FILTER NOT EXISTS { ?person foaf:name ?name }
|
||||
}
|
||||
\end{lstlisting}
|
||||
Natürlich kann man diese Abfrage auch umkehren um alle Personentripel \textbf{mit} einer Namensangabe zu finden. Hierfür kommt anstelle von \texttt{FILTER NOT EXISTS \{ ... \}} nun \texttt{FILTER EXISTS \{ ... \}} zum Einsatz. Das Ergebnis der Abfrage wäre nun das Personentripel von \texttt{:alice}.
|
||||
\end{itemize}
|
||||
|
||||
\todo{\dots} Ereignismuster lassen sich durch Sequenzen von auftretenden bzw. nicht auftretenden Ereignissen definieren. Um diese zu finden, müssen Tripel selektiert werden, die zu den benötigten Ereignistypen korrespondieren, wobei diese später über \texttt{FILTER}-Anweisungen in ihrer Reihenfolge festgelegt werden. Über Differenzen der durch \texttt{f:timestamp(?s,?p,?o)} angegebenen Zeitstempel von gegebenen Tripeln lassen sich auch zeitliche Beziehungen eingrenzen und festlegen.
|
||||
|
||||
Pattern: A, NOT B, C:
|
||||
\todo{Es folgt die Übersetzung der Operatoren der Ereignisalgebra aus Kapitel~\ref{cpt:cep_intro}, um zu erläutern, wie das alles in C-SPARQL funktionieren kann.}
|
||||
|
||||
Ich hab da mal etwas vorbereitet, und zwar das Äquivalent zu $A\ \rightarrow\ (\neg B)\ \rightarrow\ C$:
|
||||
\begin{lstlisting}[label={},caption={C-SPARQL-Query für Muster $A\ \rightarrow\ (\neg B)\ \rightarrow C$}]
|
||||
REGISTER QUERY matchANotBC AS
|
||||
PREFIX f: <http://larkc.eu/csparql/sparql/jena/ext#>
|
||||
|
Loading…
Reference in New Issue
Block a user