1

Тема: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Очень хочется получить результаты sparql - запроса в сценарии на php.
Описание конфигурации: Linux x86, Virtuoso Open Source 06.01.3127, php 5.2.17.
Virtuoso и PHP собраны согласно инструкции http://www.openlinksw.com/OdbcRails/mai … %20support
Нужен совет, что поправить и настроить. Собственно настроен iODBC, где создан DNS для сервера "Local Virtuoso" в качестве драйвера выбрал
/mnt/dev/virtuoso-6.1.3_php5.2/lib/virtodbc.so
а загрузчиком к драйверу выбрал
/mnt/dev/virtuoso-6.1.3_php5.2/lib/virtodbc_r.so

Через этот DNS (с выбранным драйвером) хорошо работают sql-запросы, а именно вот этот пример (HO-S-30 PHP ODBC Hosting Demo - см. файл odbc-sample.php): http://demo.openlinksw.com/tutorial/hos … _s_30.vsp#

А вот sparql-запросы возвращают пустоту. За основу взял обучающйи пример Tutorials/Development/RDF/PHP hosted/RQ-S-2 (SPARQL query on PHP-script Hosting): http://localhost:8890/tutorial/rdf/rq_s_2/rq_s_2.vsp#
см. http://demo.openlinksw.com/tutorial/rdf … q_s_2.vsp#
А именно файл sparql-query.php.
Сам пример у меня не запускается по причине ошибки:

Error 22023
PHP01: The PHP hosting module does not support execution of WebDAV content.

Поэтому я создал в папке /mnt/dev/virtuoso-6.1.3_php5.2/var/lib/virtuoso/vsp/ файл sparql-query.php аналогичного содержимого (как в примере).
Единственное, что поменял так это строку 100, а точнее значения параметров:
$handle=odbc_connect ($_dsn, $_user, $_pass); //с указанием "Local Virtuoso", "dba", "dba"

И вот этот пример, всегда возвращает "No rows found", хотя если выполнять этот же sparql-запрос через http://localhost:8890/conductor/sparql_input.vspx, то всё работает - результаты есть.
Запросы там такие:

sparql 
SELECT  ?title
FROM <http://local.virt/DAV/sparql_demo/data/data-xml/examples/ex2-1a.rdf>
WHERE
    { <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title }

Пробовал менять источник с

<http://local.virt/DAV/sparql_demo/data/data-xml/examples/ex2-1a.rdf>

на

<http://localhost:8890/sparql_demo/data/data-xml/examples/ex2-1a.rdf>

- этот URL доступен через браузер просто. Но смена источника не помогает, всё равно запрос не возвращает результатов (в логи Virtuoso ошибки не пишутся - просто тишина, или я не те логи смотрю).


Вопрос:
Что надо сделать, чтобы php-скрипт, работающий через php_hosting смог выполнять sparql -запросы?

Мои варианты такие:
1. Я неверно выбрал odbc драйвер. В папке lib есть два драйвера virtodbcu.so, virtodbc.so. Чем они отчличаются не знаю пока.
2. Через odbc_exec невозможно выполнить sparql-запрос к Virtuoso.

На второй случай - что можете посоветовать. Возможно, есть вариант формирования запроса через http? Посылать текст Sparql-запроса в URL к Virtuoso (такое можно например так:
http://localhost:8890/sparql?default-gr … ext%2Fhtml
Или если к демо базе OpenLink (http://demo.openlinksw.com) то так:
http://demo.openlinksw.com/sparql?defau … ext%2Fhtml

Тут конечно техническое ограничение - что длина URL не превосходит 2048 символов, но в это ограничение я вполне уложусь. Если ни у кого из когда-либо живущих не получилось выполнить sparql-запрос к Virtuoso Open Source из php, находящегося во внешнем файле, то буду использовать вариант с URL.

PS. Выбор PHP в качестве языка принципиален, так как разработку надо будет передать php-разработчику.

Отредактировано tester (2011-04-26 19:00:35)

Thumbs up Thumbs down

2

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Что запрос возвращает, если он выполнен через поставляемый вместе с Виртуозо isql? (обратите внимание, что в системе могут запросто "заваляться" несколько утилит разных производителей с одним и тем же стандартным названием isql ).

3

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Иван, спасибо за ответ. Я разобрался потихоньку сам уже.
Не знаю в чем ошибка была (иногда возникает то Segmantation fault, то longjmp causes uninitialized stack frame, и понять не могу отчего, или я запросы некоррекно пишу, или библиотеки у меня кривые, или virtuoso я плохо собрал или это дефекты).
Cделал так - попробовал на простом запросе, который всегда возвращает результат:
sparql SELECT * WHERE {?s ?p ?o}
И с этим запросом работает связка php+sparql через odbc.
Далее прошелся по запросам из документа
http://shcherbak.net/translations/ru_sp … k_net.html
тоже работает.

Победил большинство проблем, тестирую дальше.
Счас вот читаю тему Virtuoso,SPARQL и др. Вопросы начинающего: http://forum.semanticfuture.net/viewtopic.php?id=207

Thumbs up Thumbs down

4

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Здравствуйте,
делаю проект на virtuoso и php (windows), 

не работает вставка триплетов в виртуозо на русском языке,

что делать?

Запрос ниже на англ работает, но только появляется строка на русском (UTF-8) PHP выбрасывает ошибку

$inquery = "sparql INSERT DATA INTO <http://example.net/Empl> {<http://example.net/empl1> <http://example/firstname> 'Вася'.}";
Ошибка Warning: odbc_exec() [function.odbc-exec]: SQL error: [OpenLink][Virtuoso ODBC Driver][Virtuoso Server]SQ074: Line 1: Bad escape sequence in a SPARQL short double-quoted string at '\', SQL state 37000 in SQLExecDirect 

UPD Экранирование различное строки 'Вася' применял , не помогает.

UPD2 Есть ли в виртуозо аналог функции Mysql mysql-real-escape-string(), которая решает подобные задачи?

Отредактировано Ganimede (2012-09-22 10:24:52)

5

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

В ISQL всё работает с русским, включая полнотекст. Как раз вчера проверял в ответ на жалобу юзера с сишарпом:

SQL> sparql insert into <http://barto/> { [] <text> "Наша Таня громко плачет" . };

Done. -- 18 msec.
SQL> DB.DBA.RDF_OBJ_FT_RULE_ADD (null, null, 'test');

Done. -- 826 msec.
SQL> sparql select * from <http://barto/> { ?s ?p ?o . ?o bif:contains "'Наша Таня'" };
s                                                                                 p                                                                                 o
VARCHAR                                                                           VARCHAR                                                                           VARCHAR
_______________________________________________________________________________

nodeID://b10000                                                                   text                                                                              Наша Таня громко плачет

1 Rows. -- 3 msec.
SQL> sparql select * from <http://barto/> { ?s ?p ?o . ?o bif:contains "'наша таня'" };
s                                                                                 p                                                                                 o
VARCHAR                                                                           VARCHAR                                                                           VARCHAR
_______________________________________________________________________________

nodeID://b10000                                                                   text                                                                              Наша Таня громко плачет

1 Rows. -- 2 msec.
SQL> sparql select * from <http://barto/> { ?s ?p ?o . ?o bif:contains "'Бармалей'" };
s                                                                                 p                                                                                 o
VARCHAR                                                                           VARCHAR                                                                           VARCHAR
_______________________________________________________________________________


0 Rows. -- 2 msec.


С PHP я не смогу оперативно помочь, я даже не знаю как убедиться, что в соединении используется UTF-8. Практичнее спросить в мейллисте.

6

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

ок, спасибо,  напишу в мейллист,
с isql все нормально, даже через веб-интерфейс Conductor работает правильно,
поэтому и думал что у меня проблема с экранированием строк, но не помогло,
почти такая же проблема без решения описана на форуме опенлинка
http://boards.openlinksw.com/phpBB3/vie … amp;t=2708

7

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Первое что надо сделать
Раскомментировать в virtuoso.ini SQL_UTF8_EXECS и установить значение 1

8

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Здравствуйте, Ganimede.
Использовал кириллицу в PHP+Virtuoso, в Linux.
В каталоге virtuoso/lib есть odbc-драйвера для Virtuoso, именно через них идёт работа.
Ставил себе Virtuoso из исходников, поэтому после установки всё настраивал руками (возможно при установке из репозитория, настройка odbc осуществляется автоматически - не знаю).
Так вот, при настроке подключения к источнику данных (тому что в Virtuoso) надо использовать драйвера, имена которых заканчиваются на "u".


/etc/odbcinst.ini  :

[ODBC Drivers]
OpenLink Virtuoso = Installed
OpenLink Virtuoso (Unicode) = Installed

[OpenLink Virtuoso]
Driver = /usr/local/virtuoso-opensource/lib/virtodbc_r.so

[OpenLink Virtuoso (Unicode)]
Driver = /usr/local/virtuoso-opensource/lib/virtodbcu_r.so

/etc/odbc.ini :

[ODBC Data Sources]
Ganimede-virtuoso-store= OpenLink Virtuoso (Unicode)

[Ganimede-virtuoso-store]
Driver = OpenLink Virtuoso (Unicode)
Address = localhost:1111

А на стороне PHP ничего не менял, просто использовал текстовый редактор, который сохраняет файлы в UTF-8.

Отредактировано tester (2012-09-23 13:36:10)

Thumbs up Thumbs down

9

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Спасибо за ответы, но пока все также не работают запросы на добавление,

Странно то, что первый запрос с русским на добавление идет нормально, а потом
второй и следующий запрос идет в битой кодировке,
Очень наглядно на примере, табличка с объектом Вася
<tr><td>http://example.net/worker9</td><td>http://example.net/firstname</td><td>Васят</td></tr>
<tr><td>http://example.net/worker1 </td><td>http://example.net/firstname</td><td>Вася</td></tr>
<tr><td>http://example.net/worker2</td><td>http://example.net/firstname</td><td>Вася</td></tr>
<tr><td>http://example.net/worker4</td><td>http://example.net/firstname</td><td>Вася</td></tr>

10

Re: Virtuoso Open Source 6.1: sparql запрос из php ничего не возвращает

Есть запросить ответ в формате TURTLE (TTL), то тоже кривая кодировка?