Как использовать команду SPARQL INSERT с rdflib? (не ВСТАВЛЯТЬ ДАННЫЕ)

Используя Python rdflib, я пытаюсь вставить новые триплеты в граф на основе некоторых основных манипуляций с существующими триплетами. Например, в этом базовом примере я создаю график, который я заполняю, используя INSERT DATA с 4 тройками. Затем я пытаюсь уравнять ситуацию с INSERT, но это не удается. Что я делаю не так?

>>>
>>> import rdflib
>>> g = rdflib.Graph()
>>> g.update("INSERT DATA {<a> <b> <c>; <d> <e>.<f> <g> <h>; <i> <j>.}")
>>> print(list(g.triples((None, None, None))))
[(rdflib.term.URIRef('a'), rdflib.term.URIRef('d'), rdflib.term.URIRef('e')), (rdflib.term.URIRef('f'), rdflib.term.URIRef('g'), rdflib.term.URIRef('h')), (rdflib.term.URIRef('a'), rdflib.term.URIRef('b'), rdflib.term.URIRef('c')), (rdflib.term.URIRef('f'), rdflib.term.URIRef('i'), rdflib.term.URIRef('j'))]
>>> g.update("""INSERT {GRAPH {?c ?b ?a.}} WHERE {GRAPH  {?a ?b ?c.}}""")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/rdflib/graph.py", line 1161, in update
    return processor.update(update_object, initBindings, initNs, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/rdflib/plugins/sparql/processor.py", line 56, in update
    strOrQuery = translateUpdate(parseUpdate(strOrQuery), initNs=initNs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/rdflib/plugins/sparql/parser.py", line 1071, in parseUpdate
    return UpdateUnit.parseString(q, parseAll=True)[0]
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pyparsing.py", line 1955, in parseString
    raise exc
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pyparsing.py", line 3814, in parseImpl
    raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected end of text, found 'I'  (at char 0), (line:1, col:1)
>>>

person web_investigator    schedule 28.10.2020    source источник


Ответы (1)


ВСТАВЬТЕ {ГРАФИК {?c ?b ?a.}} ГДЕ {ГРАФИК {?a ?b ?c.}}

Это незаконный SPARQL. За ключевым словом GRAPH в предложениях INSERT и WHERE должна следовать либо переменная, либо IRI, указывающая исходный и целевой именованный граф.

В качестве альтернативы, если вы не заинтересованы в использовании именованных графиков и просто хотите изменить график по умолчанию, просто полностью удалите ключевые слова GRAPH (и лишние фигурные скобки).

person Jeen Broekstra    schedule 29.10.2020
comment
кроме того, вы также можете упростить его (просто синтаксический сахар), используя ключевое слово WITH в начале, если граф тот же, т.е. WITH <GRAPH_IRI> INSERT ... WHERE ... - в противном случае это, как обычно, граф по умолчанию - person UninformedUser; 29.10.2020