Как магазин триплетов решает, добавлять ли "фоновые" тройки?

Я использую несколько разных триплетов и код на R и Scala. Я думаю, что я вижу некоторые различия в:

  • включают ли триплеты триплеты, кроме тех, которые я явно загрузил.
  • точка, в которой эти "фоновые" тройки могут быть добавлены.

Существуют ли какие-либо общие правила для необходимости добавления вспомогательных словарей, независимо от технологии реализации?

Используя Jena в R, через rrdf я обычно вижу только то, что загрузил:

library(rrdf)
turtle.input.string <-
  "PREFIX prefix:  <http://example.com/>
   prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
   prefix:subject rdf:type prefix:object"
jena.model <-
  fromString.rdf(rdfContent = turtle.input.string, format = "TURTLE")
model.string <- asString.rdf(jena.model, format = "TURTLE")
cat(model.string)

Это дает:

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix prefix: <http://example.com/> .
prefix:subject  a  prefix:object .

Но иногда кажется, что тройки из RDF и RDFS появляются, когда я добавляю или удаляю тройки впоследствии. Это то, что "беспокоит" меня больше всего, но сейчас у меня проблемы с поиском примера. Если никто не знает, что я имею в виду, я выкопаю кое-что позже сегодня.

Когда я использую Blazegraph в Scala через библиотеку OpenRDF Sesame, я думаю, что я всегда получаю RDF, RDFS и OWL "бесплатно"

import java.util.Properties
import org.openrdf.query.QueryLanguage
import org.openrdf.rio._
import com.bigdata.journal._
import com.bigdata.rdf.sail._
object InjectionTest {
  val jnl_fn = "sparql_tests.jnl"
  def main(args: Array[String]): Unit = {
    val props = new Properties()
    props.put(Options.BUFFER_MODE, BufferMode.DiskRW)
    props.put(Options.FILE, jnl_fn)
    val sail = new BigdataSail(props)
    val repo = new BigdataSailRepository(sail)
    repo.initialize()
    val cxn = repo.getConnection()
    val resultStream = new java.io.ByteArrayOutputStream
    val resultWriter = Rio.createWriter(RDFFormat.TURTLE, resultStream)
    val ConstructString = "construct {?s ?p ?o} where {?s ?p ?o}"
    cxn.prepareGraphQuery(QueryLanguage.SPARQL, ConstructString).evaluate(resultWriter)
    var resString = resultStream.toString()
    println(resString)
  }
}

Даже без добавления троек construct вывод включает в себя блоки, как это:

rdfs:isDefinedBy rdfs:domain rdfs:Resource ;
    rdfs:range rdfs:Resource ;
    rdfs:subPropertyOf rdfs:isDefinedBy , rdfs:seeAlso .

1 ответ

Решение

Существуют ли какие-либо общие правила для необходимости добавления вспомогательных словарей, независимо от технологии реализации?

Это зависит от схемы логического вывода, которую ваш триплет-магазин требует поддержки. Для чистого хранилища RDF (без логического вывода) никакие дополнительные тройки не должны добавляться вообще.

Судя по тому фрагменту, который вы показали, в хранилище Blazegraph, которое вы использовали, было включено как минимум RDFS-вывод (и, возможно, частичное рассуждение OWL?). Обратите внимание, что это зависит от магазина, а не от фреймворка, так что это не вещь Йены против Сезама: обе фреймворки поддерживают магазины, которые либо делают, либо не делают рассуждения. Конечно, если вы используете какую-либо платформу и используете предложенную ими опцию "исключенные предполагаемые тройки", резервное хранилище должно учитывать этот параметр конфигурации и не включать в результат такие предполагаемые тройки.

Другие вопросы по тегам