Négociation SPARQL: Tous les éléments: Agents qui ne le sont pas: Personnes

StackOverflow https://stackoverflow.com/questions/1615472

  •  06-07-2019
  •  | 
  •  

Question

J'essaie d'écrire une requête SPARQL qui devrait me donner tous les foaf: agents qui ne sont pas foaf: Personnes .

Je ne vois pas comment appliquer cette OPTIONAL / BOUND construire à ce problème, car toutes les propriétés telles que rdfs: subClassOf et rdf: type sont transitives et réflexives.

J'ai essayé ceci:

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

Mais rdf: type semble être transitif, du moins avec JENA / ARQ / SDB.

Était-ce utile?

La solution

Cela ne fonctionne pas parce que vous avez deux liaisons de variable distinctes (? x et ? y ) qui ne sont pas liées dans votre requête. Donc, ? X doit obligatoirement figurer 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, ? y ne serait pas nécessaire; vous pouvez tester les edeg entrants / sortants de ? x directement. Cela est difficile (impossible?) À faire dans SPARQL 1.0 lorsque vous voulez vérifier si une arête n'existe pas dans une liaison de variable donnée. Toutefois, SPARQL 1.1 prend en charge la négation:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?agent
WHERE 
{
    ?agent rdf:type foaf:Agent .
    FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}

L'approche de @Kingsley Idehen (en utilisant des extensions SPARQL tierces) devrait vous aider à résoudre le problème à court terme.

Autres conseils

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) ) 
}

Comme le dit Phil M , SPARQL 1.1 introduira une nouvelle syntaxe pour simplifier son écriture.

Voici la spécification (brouillon) SPARQL 1.1 pour la négation: http: // www. w3.org/TR/sparql11-query/#negation

  

Via les extensions Virtuoso SPARQL   point de terminaison pour vérification    http://lod.openlinksw.com/sparql (instance de cache LOD Cloud)

SELECT distinct ?x ?o 
WHERE { 
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 10
DESCRIBE ?x 
WHERE { 
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 200 

Ce qui suit fonctionne maintenant, grâce à 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 . })
}

Exemples de liens en direct:

  1. Solution de requête

  2. Définition de la requête

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top