Вставка SPARQL с Fuseki не работает

Я использую fuseki, встроенный в приложение Java:

Dataset ds = DatasetFactory.createTxnMem() ;

FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
        .setPort(3333)
        .add("/ds", ds, true)
        .build() ;
server.start() ;

Конечная точка запроса работает нормально, и я могу выполнять запросы SELECT. Однако, когда я хочу вставить значения, он возвращает HTTP-код 204, но данные не добавляются в график. Вот что я сделал:

PREFIX dc: <http://purl.org/dc/elements/1.1/>INSERT DATA{ <http://example/book3> dc:title "A new book"}

<Response [204]>

затем я выбираю все, чтобы увидеть, сработало ли это:

SELECT DISTINCT * WHERE {?s ?q ?o}

и я получаю

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
  <head>
    <variable name="s"/>
    <variable name="q"/>
    <variable name="o"/>
  </head>
  <results>
  </results>
</sparql>

На стороне клиента у меня есть базовый скрипт Python:

port = 3333
test_add = 'PREFIX dc: <http://purl.org/dc/elements/1.1/>INSERT DATA{ <http://example/book3> dc:title "A new book"}'
try :
    print requests.post("http://localhost:"+str(port)+"/ds", data={'update': test_add})
    print urllib2.urlopen("http://localhost:"+str(port)+"/ds?query=SELECT%20DISTINCT%20*%20WHERE%20{?s%20?q%20?o}").read()

except Exception as e :
    print e

Этот скрипт Python работает сейчас, он был адаптирован из приведенного ниже ответа.


person Yotm    schedule 20.07.2017    source источник
comment
Не могли бы вы показать клиентский код, выполняющий операции?   -  person AndyS    schedule 20.07.2017
comment
Это просто очень простой скрипт Python (я добавил его к вопросу). Я проверил несколько вещей в переменной test_add   -  person Yotm    schedule 20.07.2017
comment
Можете ли вы попытаться создать сервер без логического аргумента? Возможно, он доступен только для чтения через HTTP.   -  person UninformedUser    schedule 20.07.2017
comment
Он по-прежнему не работает без логического значения. Это логическое значение соответствует параметру allowUpdate, я думаю, оно должно быть истинным, если мы хотим разрешить модификации.   -  person Yotm    schedule 20.07.2017


Ответы (1)


Возможно, это не очень хороший ответ, но я просто хочу показать вам, что это работает для меня.

Джена Фусеки 2.6.0

Запустить встроенный сервер

public class FusekiTestServer {
    public static void main(String[] args) {
        Dataset ds = DatasetFactory.createTxnMem() ;

        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
                .setPort(3333)
                .add("/ds", ds, true)
                .build() ;
        server.start() ;
    }
}

Вставить данные

Запрос

curl --request POST http://localhost:3333/ds --data-urlencode 'update=PREFIX dc: <http://purl.org/dc/elements/1.1/>INSERT DATA{ <http://example/book3> dc:title "A new book"}'

Выход

<html>
<head>
</head>
<body>
<h1>Success</h1>
<p>
Update succeeded
</p>
</body>
</html>

Данные запроса

Запрос

curl --request GET http://localhost:3333/ds --data-urlencode 'query=SELECT DISTINCT * WHERE {?s ?q ?o}'

Выход

<http://example/book3>
        <http://purl.org/dc/elements/1.1/title>
                "A new book" .

Диагноз

Я не эксперт по Python, но не следует ли помещать строку запроса в массив данных, поскольку это запрос POST? Что-то вроде

requests.post("http://localhost:"+str(port)+"/ds, data={'update': 'PREFIX dc: <http://purl.org/dc/elements/1.1/>INSERT DATA{ <http://example/book3> dc:title "A new book"}'})
person UninformedUser    schedule 21.07.2017
comment
Вы совершенно правы, нет смысла использовать POST как GET. Я не знаю, почему я это сделал. Я пытался поместить запрос в данные раньше, и это не сработало. Должно быть, я что-то забыл в тот момент. Когда я попробовал это сегодня утром, это сработало! Большое спасибо, я обновлю свой код - person Yotm; 21.07.2017