Menghasilkan node kosong yang sama di CONSTRUCT di beberapa solusi

Saya telah menemukan beberapa kesempatan di mana saya ingin menggunakan node kosong dalam kueri CONSTRUCT, tetapi saya perlu mendapatkan node kosong yang sama untuk semua (atau beberapa) solusi kueri.

Katakanlah kita memiliki daftar penulis dan buku yang mereka tulis dalam kumpulan data kita:

@prefix : <http://example.org#> .

:stephen_king a :Author ;
      :firstName "Stephen" ;
      :authorOf "The Shining", "Cujo".

:stephen_hawking a :Author ;
      :firstName "Stephen" ;
      :authorOf "A Brief History of Time" . 

:virginia_wolf a :Author ;
      :firstName "Virginia" ;
      :authorOf "Mrs Dalloway" . 

Sebagai contoh, katakanlah saya ingin mengikat semua buku yang ditulis oleh penulis dengan nama depan Stephen ke satu simpul kosong:

PREFIX : <http://example.org#>
CONSTRUCT {
   [ :containsBook ?book ]
}
WHERE {
   ?book ^:authorOf/:firstName "Stephen" .
}

Akan mengembalikan sesuatu seperti:

[ :containsBook "The Shining" ] .
[ :containsBook "A Brief History of Time" ] .
[ :containsBook "Cujo" ] .

tetapi hasil yang diinginkan adalah:

[ :containsBook "The Shining" ;
  :containsBook "A Brief History of Time" ;
  :containsBook "Cujo" ] .

Adakah ide tentang cara mencapai hal ini?


person Robin Keskisarkka    schedule 11.09.2017    source sumber
comment
Kueri SPARQL Anda tidak akan pernah bisa mencocokkan data ... tripel Anda hanya mengarah dari penulis ke buku, tetapi kueri Anda mencari tripel mulai dari buku   -  person UninformedUser    schedule 11.09.2017
comment
Kueri itu akan berfungsi: select * WHERE { ?book ^:authorOf/:firstName "Stephen" . BIND(BNODE() AS ?bnode) }, yaitu jalur properti berbeda   -  person UninformedUser    schedule 11.09.2017
comment
Terima kasih. Saya melewatkan ^ untuk properti invers, kueri telah diperbarui.   -  person Robin Keskisarkka    schedule 15.09.2017


Jawaban (1)


Setelah merenungkan hal ini selama beberapa waktu, saya menemukan sesuatu yang menurut saya merupakan solusi umum. Saya belum mencobanya pada banyak implementasi SPARQL, jadi harap berikan umpan balik jika Anda merasa itu tidak berhasil. Pada dasarnya, setelah menyadari bahwa kita tidak bisa melakukan apa pun tentang cara SPARQL memproses data di bagian hasil kueri, kita secara alami mulai berpikir untuk mengikat node kosong ke variabel. Jadi, katakanlah kita mencoba sesuatu seperti:

PREFIX : <http://example.org#>
CONSTRUCT {
   ?bnode :containsBook ?book
}
WHERE {
   ?book :hasAuthor/:firstName "Stephen" .
   BIND(BNODE() AS ?bnode)
}

Tidak, itu juga tidak akan berhasil. Mengapa demikian? Kueri mengevaluasi seluruh kueri dan untuk setiap solusi, fungsi BIND akan dipanggil lagi dan kita akan mendapatkan node kosong yang berbeda.

Sekarang inilah triknya. Tempatkan bagian BIND dari kueri dalam grup. Dengan begitu, karena cara kerja SPARQL dalam hal pelingkupan variabel, kita akan mendapatkan join setelah kueri dievaluasi dengan bagian ?bnode hanya akan dipanggil sekali:

PREFIX : <http://example.org#>
CONSTRUCT {
   ?bnode :containsBook ?book 
}
WHERE {
   ?book :hasAuthor/:firstName "Stephen" .
   { BIND(BNODE() AS ?bnode) }
}

Semoga seseorang menganggap ini berguna seperti saya. Bersulang.

person Robin Keskisarkka    schedule 11.09.2017
comment
Mengapa ini berfungsi dengan kurung kurawal { } adalah karena kurung kurawal tersebut menunjukkan pola grafik dasar, dan untuk node kosong, berlaku sebagai berikut: Saat menggunakan node kosong dalam bentuk _:abc, label untuk node kosong dicakup ke pola grafik dasar. - person UninformedUser; 11.09.2017
comment
Jadi, BIND dijalankan satu kali di BGP terpisah, sehingga Anda memiliki satu node kosong, dan node ini kemudian digabungkan dengan BGB luar. - person UninformedUser; 11.09.2017
comment
Atau letakkan BIND terlebih dahulu: WHERE { BIND(BNODE() AS ?bnode) ?book :hasAuthor/:firstName "Stephen" . }. Dengan BIND, keteraturan memang penting - ia mengikat apa yang terjadi sebelumnya. - person AndyS; 11.09.2017
comment
Saya tidak menganggap bahwa pesanan itu penting bagi BIND. Apakah urutan eksekusi kueri ketat, atau dapatkah algoritme pengoptimalan kueri mengacaukannya? (yaitu apakah pengoptimal diizinkan mengacaukan pesanan?) - person Robin Keskisarkka; 15.09.2017