2017-09-20 5 views
1

Ich suche nach einer einfachen Möglichkeit, Tripel aus zwei oder mehr benannten Graphen (aber nicht den gesamten unbenannten Standardgraphen) in einen anderen benannten Graphen einzufügen. Ich verwende GraphDB.einfügen von zwei benannten Graphen?

Ich denke, das durch das Schreiben aus der gleichen Abfrage mehrfach in dem WHERE Abschnitt getan werden kann, eingewickelt in mehr GRAPH Spezifikationen und sie dann zusammen unioning, aber mein WHERE s ist lang und ich würde es vorziehen, nicht zu schreiben sie mehrmals aus.

Sagen wir, ich habe einige Daten wie folgt geladen:

INSERT DATA { 
    GRAPH <http://example.com/ngA> { 
    <http://example.com/person1> <http://example.com/name> "Arthur" . 
    } 
    GRAPH <http://example.com/ngB> { 
    <http://example.com/person1> <http://example.com/name> "Brian" . 
    } 
    GRAPH <http://example.com/ngC> { 
    <http://example.com/person1> <http://example.com/name> "Charlie" . 
    } 
} 

ich alle Dreiergruppen eines bestimmten Musters aus dem Standard unbenannte Graph in einen neuen Namen Graph mit so etwas wie dieses kopieren:

INSERT { 
    GRAPH <http://example.com/ngZ> { 
    ?s <http://example.com/moniker> ?o . 
    } 
} 
WHERE 
    { ?s <http://example.com/name> ?o } 

eine einfache Möglichkeit, SELECT für Tripel von einem vorgegebenen Muster von zwei oder mehr (aber nicht alle) namens Graphen ist

SELECT * 
FROM <http://example.com/ngA> 
FROM <http://example.com/ngB> 
WHERE 
    { ?s <http://example.com/name> ?o } 

Was ist, wenn ich diese Tripel aus diesen angegebenen Graphen in einen anderen Graphen kopieren möchte?

ich einen Fehler von GraphDB 8.3 (und vom sparql.org Validator) bekommen, wenn ich versuche zu

INSERT { 
    GRAPH <http://example.com/ngZ> { 
    ?s <http://example.com/moniker> ?o . 
    } 
} 
WHERE 
    { SELECT * 
FROM <http://example.com/ngA> 
FROM <http://example.com/ngB> 
WHERE 
    { ?s <http://example.com/name> ?o } } 

Antwort

2

Diese Abfrage:

PREFIX ex: <http://example.com/> 

INSERT { 
    GRAPH ex:ngZ { ?s ex:moniker ?o } 
} 
WHERE { 
    GRAPH ?g { ?s ex:name ?o } 
    FILTER (?g IN (ex:ngA, ex:ngB)) 
} 

Und dann:

PREFIX ex: <http://example.com/> 

SELECT * 
FROM NAMED ex:ngZ 
WHERE { 
    GRAPH ?g { ?s ?p ?o } 
} LIMIT 100 

Ist es das, was Sie brauchen?

Übrigens gibt es (mit Vorsicht verwenden!) Und ADD.

3

Danke, @Stanislav Kralin

davon Kommen Sie zu denken, das funktioniert auch:

PREFIX ex: <http://example.com/> 
INSERT { 
    GRAPH ex:ngZ { 
     ?s ex:moniker ?o 
    } 
} 
WHERE { 
    values ?g { 
     ex:ngA ex:ngB 
    } 
    GRAPH ?g { 
     ?s ex:name ?o 
    } 
} 
1

SPARQL Update bietet USING und USING NAMED analog zu FROM und FROM NAMED in Abfragen:

Die Die Verwendung von NAMED-Klauseln wirkt sich auf das RDF-Dataset aus, das bei der Auswertung der WHERE-Klausel verwendet wird. Dies beschreibt einen Datensatz in der gleichen Weise wie FROM und FROM GENANNT Klauseln

Sie die Anforderung als UPDATE wie so ausdrücken:

INSERT { 
    GRAPH <http://example.com/ngZ> { 
    ?s <http://example.com/moniker> ?o . 
    } 
} 
USING <http://example.com/ngA> 
USING <http://example.com/ngB> 
WHERE 
    { ?s <http://example.com/name> ?o } 

Beachten Sie auch, dass nach der SPARQL query grammar, eine Unterabfrage tut keine Datensatzklausel zulassen. Aus diesem Grund lehnen die SPARQL-Parser Ihre Abfrage ab.

Verwandte Themen