4 Stimmen

SPARQL: Abfrage, um alle Instanzen von zwei Klassen zu erhalten, die die gleichen Verbindungen zu einer dritten Klasse haben

Ich versuche, die Möglichkeiten von SPARQL zu verstehen und frage mich, ob diese Art von Abfrage möglich ist:

Diagramm der Struktur meiner Ontologie (sorry, ich darf noch keine Bilder einstellen)

Ich möchte alle Instanzen der Klasse A und B erhalten, die Verbindungen zu den gleichen Instanzen der Klasse B haben:

Select ?a, ?c
Where
{
 ?a myOntology:ab ?c .
 ?c myOntology:cb ?B .
}

Das würde mir helfen:

A:1 C:1
A:2 C:1 (with B:2)
A:2 C:1 (with B:3)

(wobei der Buchstabe für die Klasse und die Zahl für die Instanz steht, von oben gezählt)

Allerdings mit dem Unterschied, dass ich nur diejenigen haben möchte, die genau die gleichen verwandten Instanzen von B haben:

A:2 C:1 (with B:2 and B:3)

Ist das möglich oder muss ich dafür eine externe Logik verwenden?

Ich würde mich über jede Antwort freuen...

1voto

mgs Punkte 86

Ja, das können Sie! wenn Sie NOT EXISTS verwenden können.

SPARQL hat, wie SQL, keinen universellen Quantifizierer, aber man kann mit verschachtelten NOT EXISTS-s arbeiten.

Ihre Anfrage lautet in Pseudo-SPARQL: "Gib mir alle Paare (a,c), so dass a-b-c so ist, dass kein anderes bb so ist, dass a-bb und nicht bb-c --- und umgekehrt: bb-c und nicht a-bb":

PREFIX : <http://test/>
SELECT ?a ?b ?c
WHERE 
{ ?a :ab ?b .
  ?b :bc ?c .
  FILTER NOT EXISTS
  { ?a :ab ?bb .
    FILTER NOT EXISTS
    {  ?bb :bc ?c . } 
  }
  ## vise verse:
  FILTER NOT EXISTS
  { ?bb :bc ?c .
    FILTER NOT EXISTS
    {  ?a :ab ?bb . } 
  }
}

Betrieb auf

@prefix : <http://test/> .
:a1 :ab :b1 .
:a1 :ab :b2 .
:a2 :ab :b2 .
:a2 :ab :b3 .
:b2 :bc :c1 .
:b3 :bc :c1 .

gibt

----------------------------------------------------------
| a                | b                | c                |
==========================================================
| <http://test/a2> | <http://test/b3> | <http://test/c1> |
| <http://test/a2> | <http://test/b2> | <http://test/c1> |
----------------------------------------------------------

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X