Flazzo memiliki fokus utama untuk menambah nilai bisnis Anda.

Blog

10 hal yang perlu diketahui saat menggunakan SHACL dengan GraphDB

16789653-thumb.jpg
Blog

10 hal yang perlu diketahui saat menggunakan SHACL dengan GraphDB


Hari ini saya mengalami salah satu momen ketika saya benar-benar yakin bahwa jika saya tidak menulisnya, saya akan lupa bagaimana melakukannya lain kali. Untuk salah satu proyek yang sedang saya kerjakan, kita perlu melakukan validasi SHACL terhadap data RDF yang akan disimpan di Ontotext GraphDB. Inilah 10 hal yang perlu saya pelajari saat melakukan ini. Beberapa dari mereka cukup jelas, tetapi beberapa kurang jelas bagi saya.

Nomor 1: Untuk melakukan validasi SHACL, repositori Anda harus dikonfigurasi untuk SHACL saat Anda membuat repositori Anda. Itu tidak bisa dilakukan setelah itu.

Nomor 2: Tampaknya lebih baik untuk mengimpor ontologi Anda (atau ontologi Anda) dan data Anda dalam grafik yang berbeda. Ini berguna ketika Anda ingin mengimpor ulang ontologi (atau ontologi) atau data Anda, karena dengan demikian Anda dapat sepenuhnya mengganti grafik bernama tertentu. Ini sangat membantu saya saat membuat prototipe. Tangkapan layar di bawah ini:

Nomor 3: Bentuk SHACL diimpor ke grafik ini bernama:


…secara default. Pada waktu konfigurasi, Anda dapat menyediakan satu atau beberapa grafik bernama berbeda untuk bentuk SHACL Anda.

Nomor 4: Untuk menemukan grafik bernama di repositori Anda, Anda dapat melakukan kueri SPARQL berikut:

select distinct ?g 
where {
  graph ?g {?s ?p ?o }
}

Anda kemudian dapat meminta bagan bernama tertentu sebagai berikut:

select * 
from <myNamedGraph>
where { 
	?s ?p ?o .
}

Nomor 5: Namun, mendapatkan graf bernama tidak mengembalikan graf bernama SHACL. Di StackOverflow seseorang menyarankan agar formulir SHACL dapat diambil menggunakan:

http://address:7200/repositories/myRepo/rdf-graphs/service?graph=

Namun, itu tidak berhasil untuk saya. Sebaliknya, kode berikut bekerja dengan andal:

import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
import org.eclipse.rdf4j.model.vocabulary.RDF4J;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.http.HTTPRepository;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.Rio;
import org.eclipse.rdf4j.rio.WriterConfig;
import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings;

import java.util.stream.Collectors;

public class RetrieveShaclShapes {
    public static void main(String[] args)  {
        String address = args[0]; /* i.e.  */
        String repositoryName = args[1]; /* i.e. myRepo */
        
        HTTPRepository repository = new HTTPRepository(address, repositoryName);
        try (RepositoryConnection connection = repository.getConnection()) {
            Model statementsCollector = new LinkedHashModel(
                    connection.getStatements(null, null,null, RDF4J.SHACL_SHAPE_GRAPH)
                    .stream()
                    .collect(Collectors.toList()));
            Rio.write(statementsCollector, System.out, RDFFormat.TURTLE, new WriterConfig().set(
                    BasicWriterSettings.INLINE_BLANK_NODES, true));
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

…menggunakan dependensi berikut di pom.xml:

    <dependency>
        <groupId>org.eclipse.rdf4j</groupId>
        <artifactId>rdf4j-client</artifactId>
        <version>4.2.3</version>
        <type>pom</type>
    </dependency>

Nomor 6: Agar kode di atas berfungsi tidak mudah karena saya memilih untuk menggunakan panci minyak. saya bertemu dengan seorang”org.eclipse.rdf4j.rio.UnsupportedRDFormatException: Did not recognise RDF format object“.RFD4J menggunakan antarmuka Java Service Provider (SPI) yang menggunakan file di META-INF/services jar untuk menyimpan implementasi parser. ITU maven-assembly-plugin Saya dulu, untuk menghasilkan pot lemak, menyebabkan pot yang berbeda hancur META-INF/services sehingga kehilangan informasi pendaftaran. Solusinya adalah dengan menggunakan plugin maven-shade yang menyatu META-INF/services lebih tepatnya menghancurkannya. Di pom Anda, Anda perlu menambahkan yang berikut ke konfigurasi plugin Anda:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.4.1</version>
        <executions>
          <execution>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

Anda dapat menghindari masalah ini dengan menggunakan panci terpisah daripada hanya satu panci minyak.

Nomor 7: Mengimpor bentuk baru ke grafik bentuk SHACL akan menambah informasi tentang bentuk baru. Dia tidak akan menggantikan grafik yang ada bahkan ketika Anda memiliki keduanya

  • “Aktifkan menimpa data yang ada” dan
  • “Saya mengerti bahwa data untuk grafik yang diganti akan dihapus sebelum mengimpor data baru.”

opsi diaktifkan, seperti yang ditunjukkan pada tangkapan layar berikut:

Untuk mengganti grafik bernama SHACL, Anda harus menghapusnya secara eksplisit dengan menjalankan perintah SPARQL berikut:

clear graph <>

Saya sendiri merasa lebih mudah untuk memperbarui formulir SHACL secara terprogram. Perhatikan bahwa saya menggunakan grafik bernama SHACL secara default:

import org.eclipse.rdf4j.model.vocabulary.RDF4J;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.http.HTTPRepository;
import org.eclipse.rdf4j.rio.RDFFormat;

import java.io.File;

public class UpdateShacl {
    public static void main(String[] args)  {
        String address = args[0]; /* i.e.  */
        String repositoryName = args[1]; /* i.e. myRepo */
        String shacl = args[2];
        File shaclFile = new File(shacl);

        HTTPRepository repository = new HTTPRepository(address, repositoryName);
        try (RepositoryConnection connection = repository.getConnection()) {
            connection.begin();
            connection.clear(RDF4J.SHACL_SHAPE_GRAPH);
            connection.add(shaclFile, RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH);
            connection.commit();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

Nomor 8: Secara terprogram, Anda dapat menghapus grafik bernama menggunakan kode ini dan ketergantungan Maven yang sama yang kami gunakan di atas:

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.http.HTTPRepository;

public class ClearGraph {
    public static void main(String[] args)  {
        String address = args[0]; /* i.e.  */
        String repositoryName = args[1]; /* i.e. myRepo */
        String graph = args[2]; /* i.e.  */

        ValueFactory valueFactory = SimpleValueFactory.getInstance();
        IRI graphIRI = valueFactory.createIRI(graph);
        
        HTTPRepository repository = new HTTPRepository(address, repositoryName);
        try (RepositoryConnection connection = repository.getConnection()) {
            connection.begin();
            connection.clear(graphIRI);
            connection.commit();
        }
    }
}

Nomor 9: Jika Anda memperbarui grafik bentuk dengan batasan yang tidak dipenuhi oleh data yang ada, Anda harus mengoreksi data terlebih dahulu sebelum dapat mengunggah definisi bentuk baru.

Nomor 10: Saat mengunduh bentuk SHACL, fitur yang tidak didukung gagal secara diam-diam. Saya datang dengan ide ini untuk menambahkan informasi yang dapat dibaca manusia ke definisi formulir untuk memudahkan pengguna memahami kesalahan validasi. Sayangnya “sh:name” Dan “sh:description” tidak didukung oleh GraphDB versi 10.0.2. dan 10.2.0. Juga, gagal diam-diam. Di Workbench, ini akan menunjukkan bahwa itu berhasil dimuat, seperti yang ditunjukkan pada tangkapan layar layar berikutnya:

Namun, di log saya melihat peringatan berikut:

Karena ini dicatat sebagai peringatan, saya berharap formulir saya dimuat dengan benar, kecuali kembar tiga relatif terhadap “sh:name” Dan “sh:description” diabaikan. Namun, formulir saya tidak dimuat sama sekali.

Anda menemukan daftar fitur SHACL yang didukung Di Sini.

Kesimpulan

Pesan ini mungkin tampak kritis terhadap GraphDB. Namun, ini bukan niatnya. Saya pikir ini lebih merupakan kasus rasa sakit yang masih dirasakan di sekitar adopsi SHACL (dan Shex, saya kira).

Sumber daya yang telah membantu saya dalam pemecahan masalah adalah: