11
votes

Négation Sparql: Tous FOAF: Agents qui ne sont pas FOAF: Personnes

J'essaie d'écrire une requête Sparql qui devrait me donner tous FOAF: agents code> qui ne sont pas foaf: personnes code>.

Je ne peux pas voir un façon d'appliquer Cette construction en option / lié à ce problème, Parce que toutes les propriétés telles que rdfs: sous-classes code> et rdf: type code> sont transitifs et réflexifs. P>

J'ai essayé ceci: P>

SELECT * WHERE { 
?x rdf:type foaf:Agent 
OPTIONAL { ?y rdf:type foaf:Person } 
FILTER ( !BOUND(?y) ) }


0 commentaires

5 Réponses :


12
votes

La raison pour laquelle cela ne fonctionne pas est que vous avez deux liaisons variables distinctes (? x et ? y ) qui ne sont pas liés dans votre requête. Donc ? X doit être lié à apparaître dans le jeu de résultats (ce que vous voulez), mais si ? Y est non lié, vous n'avez rien appris de nouveau sur ? x .

mise à jour: dans une requête idéale, il n'y aurait pas besoin de ? y du tout; Vous pouvez tester les Edeg entrants / sortants de ? x directement. Ceci est difficile (impossible?) À faire dans SPARQL 1.0 lorsque vous souhaitez vérifier si un bord n'existe pas sur une liaison variable donnée. Cependant, SPARQL 1.1 fournira un support à la négation: < Pré> xxx

L'approche de @kingsley Idehen (à l'aide d'extensions SPARQL tiers) devrait vous aider à résoudre le problème à court terme.


3 commentaires

Mais comment puis-je configurer une relation entre? X et? Y?


SPARQL 1.1 va certainement avoir une négation, le groupe de travail du groupe de travail à Iswc 2009 était clair sur ce


Notez que SPARQL 1.1 Syntaxe (comme spécifié dans le lien) est en réalité filtre n'existe pas (nécessite le filtre mot-clé à l'avance)



2
votes

VIA VIRTUOSO SPARQL Extensions Point de terminaison de vérification http://lod.openlinksw.com/sparql (instance de cache de nuage LOD) xxx xxx


0 commentaires

9
votes

Pour ce faire dans SPARQL 1.0, vous devez écrire:

SELECT * WHERE { 
     ?x rdf:type foaf:Agent 
     OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . } 
     FILTER ( !BOUND(?y) ) 
}


0 commentaires

2
votes

Voici le (projet) SPARQL 1.1 SPECT pour la négation: http: // www. w3.org/tr/sparql11-query/#negation


0 commentaires

1
votes

Ce qui suit fonctionne maintenant, avec la courtoisie de SPARQL 1.1:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
SELECT DISTINCT COUNT(?agent)
WHERE 
{
    ?agent rdf:type foaf:Agent .
    FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}


0 commentaires