2016-07-12 9 views
0

Ich möchte alle Mathematiker aus DBpedia bekommen, so schrieb ich diese Abfrage für DBpedia's SPARQL service:Wie man Knoten vom Pfad ausschließt?

SELECT DISTINCT ?person 
{ 
    ?person dct:subject ?category. 
    ?category skos:broader* dbc:Mathematicians. 
} 

Das Problem dabei ist, dass die Kategorie Mathematicians verschmutzt ist, aufgrund Kategorien wie dbc:Euclid, die dann alle euklidischen enthält Geometrie. Ich glaube, es ist Kategorien wie diese, die die Abfrage fehlschlagen:

Virtuoso 42000 Fehler TN ...: Überschritten 1000000000 Bytes in transitiv temporären Speicher. verwenden t_distinct, t_max oder mehr T_MAX_memory Optionen, um die Suche zu begrenzen oder den Pool

Viele der problematischen Kategorien sind in dbc:Wikipedia_categories_named_after_mathematicians zu erhöhen.

Gibt es eine Möglichkeit, diese Kategorien im skos:broader* Pfad zu ignorieren, der den Fehler verschwinden lassen würde?

+1

Ich denke, ein Problem hier ist, dass die DBpedia Kategoriehierarchie, die auf der Wikipedia Kategorien basieren Zyklen enthalten kann, das heißt, dass ein Grund für den Fehler sein könnte - obwohl dies sollte nicht passieren, tatsächlich. – AKSW

Antwort

0

Sie können die Kategorien auflisten, die Sie nicht wollen, durch Filtern sie heraus umfassen:

SELECT DISTINCT ?person 
{ 
    ?person dct:subject ?category. 
    ?category skos:broader* dbc:Mathematicians. 
    FILTER (?category NOT IN (dbc:Euclid)) 
} 

Aber das wird nicht den Fehler entfernen, weil Virtuoso noch die skos:broader Hierarchie zu durchqueren muss, anstrengend transitive‘ Haufenspeicher '. Andere Ansätze umfassen das Auswählen bestimmter Kategorien oder das Durchqueren eines Teils der Hierarchie.

SELECT DISTINCT ?person 
{ 
    VALUES ?category {dbc:Mathematicians dbc:Mental_calculators dbc:Lists_of_mathematicians} 
    ?person dct:subject ?category. 
} 

Für einen Teil der Hierarchie abzufragen, können Sie verwenden, um einige Eigenschaft Pfadausdrücke:

Die spezifische Kategorie UNION Aussagen, aber die VALUES Verknüpfung ist eine einfachere Syntax verwenden könnte. Dieser wird erhalten Eltern und Großeltern:

SELECT DISTINCT ?person 
{ 
    ?person dct:subject ?category. 
    ?category skos:broader | (skos:broader/skos:broader) dbc:Mathematicians. 
    # filter as desired - FILTER (?category NOT IN (dbc:Euclid)) 
} 
Verwandte Themen