Я работаю над семантическим веб-проектом (я новичок в этом вопросе) с этой онтологией искусства: http://spraakdata.gu.se/svedd/painting-ontology/painting.owl используя SPARQL и библиотеку PHP ARC2. Я использую следующий код. Это работает, но результаты не полны:
<?php
include_once("arc2/ARC2.php");
$config = array(
/* db */
'db_name' => 'ontologia',
'db_user' => 'root',
'db_pwd' => '',
/* store */
'store_name' => 'arc_tests',
/* stop after 100 errors */
'max_errors' => 100,
);
$store = ARC2::getStore($config);
if (!$store->isSetUp()) {
$store->setUp();
}
/* LOAD will call the Web reader, which will call the
format detector, which in turn triggers the inclusion of an
appropriate parser, etc. until the triples end up in the store. */
//$store->query('LOAD <http://localhost/ontologia/painting2.owl.xml>');$q = '
PREFIX painting: <http://spraakbanken.gu.se/rdf/owl/painting.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT *
WHERE {
?subject painting:createdBy ?object;
rdfs:label ?title.
}';
$r = '';
$id = 0;
if ($rows = $store->query($q, 'rows')) {
/* display the results in an HTML table */
echo "<table border='1'>
<thead>
<th>#</th>
<th>(Subject)</th>
<th>title</th>
</thead>";
/* loop for each returned row */
foreach( $rows as $row ) {
print "<tr><td>".++$id. "</td>
<td>" . $row['subject']. "</td>".
"<td>" . $row['title']. "</td>";
}
echo "</table>" ;
}
else{
echo "No hay resultados";
}
//$rs = $store->query('...');
$p='';
if ($errs = $store->getErrors()) {
/* $errs contains errors from the store and any called
sub-component such as the query processor, parsers, or
the web reader */
foreach ($errs as $err) {
$p .= '<li>' . $err. '</li>';
}
echo $p;
}?>
В этом случае запрос ищет все тройки с предикатом «createBy».
Я получаю только два результата:
но я могу видеть в онтологии, что есть много картин с предикатом noy только те. Однако у них нет свойства «label», например «Guernica»:
<owl:NamedIndividual rdf:about="http://spraakbanken.gu.se/rdf/owl/painting.owl#GuernicaObj">
<rdf:type rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#Painting"/>
<rdf:type rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#Reference"/>
<hasIntendedUse rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#Attention"/>
<hasColor rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#Black"/>
<hasColor rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#Gray"/>
<hasCreationDate rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#GuernicaCreationDate"/>
<hasDimension rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#GuernicaHeight"/>
<hasRepresentation rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#GuernicaJPG"/>
<hasTitle rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#GuernicaTitle"/>
<displayedAt rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#InternationalExposition"/>
<hasCurrentLocation rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#MuseoReinaSofía"/>
<createdBy rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#PabloPicasso"/>
<hasPaintType rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#StandOil"/>
<hasColor rdf:resource="http://spraakbanken.gu.se/rdf/owl/painting.owl#White"/>
</owl:NamedIndividual>
Некоторые картины имеют определенные структуры и некоторые важные свойства (например, label или madeBy), а другие — нет, что затрудняет обработку. Как я могу искать такую онтологию? Я делаю что-то неправильно?. Онтология плохо построена?
Поскольку некоторые ресурсы, соответствующие первому тройному шаблону, не имеют rdfs:label
, ты можешь использовать OPTIONAL
чтобы получить все результаты, независимо от того, была ли определена метка.
SELECT *
WHERE {
?subject painting:createdBy ?object .
OPTIONAL { ?subject rdfs:label ?title .}
}
Примечание о синтаксисе SPARQL. .
означает конец тройного паттерна. ;
означает, что объект из предыдущего тройного шаблона используется для создания тройного шаблона. Я не уверен, что ваш парсер SPARQL будет делать с ;.
,
Других решений пока нет …