2016-04-05 9 views
0

Die folgende Abfrage lädt Verträge aus meinem Datensatz (ein Vertrag besteht zwischen einer Organisation und einem Partner).Optimieren der SPARQL-Abfrage zum Laden von SAMPLE-Labels

SELECT ?contract ?organisation ?partner 
WHERE { 
    ?organisation 
     a gr:BusinessEntity ; 
     rejstriky:contract ?contract . 

    ?contract a rejstriky:Contract ; 
     rejstriky:partner ?partner . 
} 
GROUP BY ?contract ?organisation ?partner 

Diese Abfrage gibt rund 8000 Verträge zurück und es tut das sofort (es dauert nur einen Bruchteil der Sekunde). Jetzt muss ich Etiketten/Namen für die Organisation und den Partner laden. Es könnte mehrere Namen geben, ich brauche nur einen. Dies ist meine Frage:

SELECT ?contract ?organisation ?partner 
    (SAMPLE(?organisationNames) AS ?organisationName) 
    (SAMPLE(?partnerNames) AS ?partnerName) 
WHERE { 
    ?organisation 
     a gr:BusinessEntity ; 
     rejstriky:contract ?contract . 

    ?contract a rejstriky:Contract ; 
     rejstriky:partner ?partner . 

    ?organisation gr:legalName ?organisationNames . 
    ?partner gr:legalName ?partnerNames . 
} 
GROUP BY ?contract ?organisation ?partner 

Diese Abfrage plötzlich mehrere Minuten in Anspruch nimmt zu beenden.

Ich habe einige Experimente gemacht und herausgefunden, dass es weniger als 2 Minuten dauern würde, wenn ich mich dazu entschließen würde, alle Namen mit separaten SPARQL-Aufrufen (40 Namen in einem einzigen Stapel) zu erhalten. . Unabhängig davon, wenn ich in der Lage bin, diese 8000 Elemente innerhalb eines Bruchteils von Sekunden zu erzeugen, sollte das Laden von zwei Etiketten für jedes Element nicht so lange dauern.

Haben Sie Ideen, wie Sie meine Anfrage optimieren können? Beachten Sie, dass ich Virtuoso verwende.

+0

Dies scheint ein kleines Problem in Virtuosos Abfrageplaner - es gibt keinen offensichtlichen Grund, dass dies so lange dauern sollte. Haben Sie versucht, das Problem direkt zu melden und zu sehen, ob es eine Lösung gibt? –

+1

Die erste Schätzung ist ein Abfrageoptimierungsfehler in Virtuoso. Haben Sie die Geschwindigkeit ohne das SAMPLE-Aggregat getestet? Das heißt, die 'SELECT'-Liste in' 'contract? Organization? Partner? OrganisationNames? PartnerNames'? Sie können dies auch an die [Virtuoso Users-Mailingliste] (https://lists.sourceforge.net/lists/listinfo/virtuoso-users/) oder das [OpenLink Support-Forum] (http://boards.openlinkssw.com) richten /support/index.php) welche Zielgruppen mehrere Mitglieder des Virtuoso-Entwicklungsteams enthalten ... – TallTed

+0

Ich fand heraus, dass das Dataset leicht beschädigt ist. Etwa 1000 der Partner sind durch einen einzigen URI vertreten, der jedoch 1000 verschiedene juristische Namen hat. Wenn ich die Aggregation entferne, läuft sie tatsächlich etwa 3 mal schneller, aber sie erzeugt 41 Millionen Einträge. Vielleicht ist es das, was die SAMPLE-Aggregation durcheinander bringt und die Abfrage verlangsamt. Allerdings würde ich immer noch sagen, dass die Auswahl eines Beispielwerts für 8000 Elemente ziemlich schnell sein sollte, unabhängig von der Größe des Satzes, aus dem ich mich entscheide. Was denken Sie? – tobik

Antwort

0

Wenn Sie keinen Zugriff auf Beispieldaten oder Virtuoso haben, ist es schwierig, sicher zu sein, ob dies hilfreich ist, aber Sie könnten versuchen, die Verwendung von SAMPLE zu vermeiden.

SELECT ?contract ?organisation ?organisationName ?partner ?partnerName 

WHERE { 
    ?organisation 
     a gr:BusinessEntity ; 
     rejstriky:contract ?contract . 

    ?contract a rejstriky:Contract ; 
     rejstriky:partner ?partner . 

    { SELECT ?organisationName WHERE { ?organisation gr:legalName ?organisationName . } LIMIT 1} 
    { SELECT ?partnerName WEHRE {?partner gr:legalName ?partnerName . } LIMIT 1} 
} 
GROUP BY ?contract ?organisation ?organisationName ?partner ?partnerName 
+0

Danke, gute Idee. Aber die Abfrage dauerte fast eine Stunde und endete mit einem Ergebnis mit leeren Namen. – tobik