3 votes

Recherche de correspondances partielles dans un graphique RDF

Comment puis-je effectuer une recherche dans une base de données RDF pour trouver les segments du graphique qui se chevauchent le plus avec un exemple de graphique ?

Par exemple, disons que ma base de données stocke les graphiques arbitraires suivants :

entity1 [
    type "TOP" ;
    attr1 [
        attr11 [
            attr111 "apple" ;
        ] ;
        attr12 [
            attr121 "orange" ;
        ] ;
        attr13 [
            attr131 "banana" ;
        ] ;
    ] ;
    attr2 [
        attr21 [
            attr211 "falcon" ;
        ] ;
        attr22 [
            attr221 "pigeon" ;
        ] ;
        attr23 [
            attr231 "parrot" ;
        ] ;
    ] ;
] .
entity2 [
    type "TOP" ;
    attr11 [
        attr111 "apple" ;
    ] ;
    attr12 [
        attr121 "orange" ;
    ] ;
] .
entity3 [
    type "TOP" ;
    attr2 [
        attr_middle [
            attr21 [
                attr211 "falcon" ;
            ] ;
            attr22 [
                attr221 "pigeon" ;
            ] ;
            attr23 [
                attr231 "parrot" ;
            ] ;
        ] ;
    ] ;
] .

Et maintenant disons que j'ai l'exemple de graphique :

sample [
    type "TOP" ;
    attr11 [
        attr111 "apple" ;
    ] ;
    attr12 [
        attr121 "orange" ;
    ] ;
    attr13 [
        attr131 "banana" ;
    ] ;
    attr21 [
        attr211 "falcon" ;
    ] ;
    attr22 [
        attr221 "pigeon" ;
    ] ;
    attr23 [
        attr231 "parrot" ;
    ] ;
] .

Il est clair que rien dans la base de données ne correspond parfaitement à l'échantillon, mais que chaque entité y correspond partiellement, même si les triples commensaux existent à différents niveaux dans chaque graphique.

Comment puis-je trouver les correspondances les plus proches de l'échantillon ? Dans ce cas, je m'attendrais à ce qu'une requête renvoie la meilleure correspondance triée en premier, [entity1, entity3, entity2] .

Je suis encore un peu novice en matière de RDF, alors pardonnez-moi si ma terminologie est erronée. D'après ce que je comprends actuellement des bases de données RDF, ce que j'essaie de faire n'est pas typiquement la façon dont elles sont utilisées. Si je veux trouver les entités "contenant" la relation attr111 = "apple" à l'aide d'une requête SPARQL, je dois généralement supposer que la relation se trouve à un emplacement fixe par rapport à chaque entité, alors que la recherche de triplets à des emplacements arbitraires par rapport à une "racine" est beaucoup plus difficile. Est-ce exact ?

2voto

RobV Points 13708

Non, ce n'est pas si difficile, mais vos requêtes SPARQL peuvent devenir assez longues pour y parvenir. Il n'est pas nécessaire de supposer que la racine est fixe puisque vous pouvez utiliser des variables pour la racine, comme indiqué dans mes exemples. Dans le cas où la racine est fixe, remplacez la variable par une valeur.

Note - Si la requête résultante ne contient pas de variables, il serait préférable de la formuler comme une requête de type ASK requête. Si vous utilisez un SELECT et qu'il n'y a pas de variables, vous n'avez aucun moyen de faire la distinction entre les résultats d'une requête qui correspondent et ceux qui ne correspondent pas. Alors qu'une ASK La requête renvoie soit true o false selon que le WHERE la clause correspond

Si votre processeur SPARQL supporte SPARQL 1.1, vous pouvez utiliser des chemins de propriété, par exemple

SELECT * WHERE { ?s ex:predicate / ex:predicate / ex:predicate "value" }

Si vous ne disposez que de SPARQL 1.0, vous devez indiquer la correspondance de manière explicite, comme suit :

SELECT * WHERE
{
  ?s ex:predicate _:b1 .
  _:b1 ex:predicate _:b2 .
  _:b2 ex:predicate "value" .
}

Notez que sémantiquement ces deux formes sont en fait équivalentes - la forme SPARQL 1.1 est un joli raccourci syntaxique pour la forme SPARQL 1.0.

Évidemment, plus la partie de votre graphique que vous voulez faire correspondre est grande, plus votre requête SPARQL sera grande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X