один и тот же код python работает по-разному в FLASK и скрипте CLI - PullRequest
0 голосов
/ 09 марта 2020

Я запускаю код в python сценарии и код в flask API. Проблема в том, чтобы добавить rdf-тройки в rdflib Graph. Если я запускаю его в скрипте командной строки, анализируемом интерпретатором, он работает. Если я запускаю тот же код в flask API, он игнорирует некоторые логики c. Код:

FLASK

class Helper(object):
    def get_fred_offset(self, s):
        return s.split('_')[1]

    def get_denoted_offset(self, g):
        query = """ SELECT ?denoted ?offset WHERE { ?offset a ns2:PointerRange ; ns6:denotes ?denoted . } """
        qres = g.query(query)
        res = []
        for row in qres:
            res.append((row[0], self.get_fred_offset(row[1].strip()))) # denoted, startOffset
        return res

    def get_span_boundaries(self, g):
        query = " SELECT  ?textspan ?start ?end WHERE { ?textspan rst:startOffset ?start ; rst:endOffset ?end . }"
        qres = g.query(query)
        res = []
        for row in qres:
            res.append((row[0], row[1].strip(), row[2].strip()))
        return res

    def bridge(self, g):
        denoteds = self.get_denoted_offset(g)
        spans = self.get_span_boundaries(g)
        for d in denoteds:
            for s in spans:
                if s[1] <= d[1] < s[2]:
                    g.add( (d[0] , URIRef('belongsTo'), s[0]))
        return g

конечная точка

@app.route("/bridge", methods=["POST"])
@cross_origin()
def merge():

    fh = filehandler.open_file(TMP_FOLDER, 'bridge_graph', m='r')
    data = ""
    g = Graph()
    for line in fh:
        data += line
    g.parse(data = data , format = 'n3' )
    wtf = Helper()
    wtf.bridge(g)

    return (g.serialize(format= 'n3'))

Python .py script

g = Graph()
fh = open("bridge_graph", 'r')
data = ""
for line in fh:
    data += line
g.parse(data = data , format = 'n3' )


def get_f_offset(s):
    return s.split('_')[1]

def get_denoted_offset(g):
    query = """ SELECT ?denoted ?offset WHERE { ?offset a ns2:PointerRange ; ns6:denotes ?denoted . } """
    qres = g.query(query)
    res = []
    for row in qres:
        res.append((row[0], get_f_offset(row[1].strip()))) # denoted, startOffset
    return res

def get_span_boundaries(g):
    query = " SELECT  ?textspan ?start ?end WHERE { ?textspan rst:startOffset ?start ; rst:endOffset ?end . FILTER (?start <= 5 && 5 < ?end) }"
    qres = g.query(query)
    res = []
    for row in qres:
        res.append((row[0], row[1].strip(), row[2].strip()))
    return res

def bridge(g):
    denoteds = get_denoted_offset(g)
    spans = get_span_boundaries(g)
    for d in denoteds:
        for s in spans:
            if s[1] <= d[1] < s[2]:
                print(s[1], d[1], s[2]) 
                print(d[0], 'belongsTo', s[0])
                g.add( (d[0] , URIRef('belongsTo'), s[0])) <=============== THISLINE

bridge(g)

print g.serialize(format='n3')

В одном случае THISLINE добавлять три в другом случае нет.

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Эта проблема связана с тем, что вы должны указать тип данных Literal вашего сравнения. Вместо сравнения целых или обычных чисел RDFLIB SPARQL Parser сравнивает строку, вызывая непредвиденное поведение. Теперь я считаю, что это не проблема rdflib, а проблема SPARQL, требующая строгого декларирования типов. Добавление: g.query(query, initBindings{?start : Literal^^xsd:Integer} решена проблема!

0 голосов
/ 13 марта 2020

После комментария Виктора rdflib, скорее всего, полностью откажется от поддержки Python 2 к июлю.

Также я предлагаю использовать точно тот же код для скрипта, что и в Helper ( ), поэтому добавьте if __name__ == '__main__: в файл класса Helper(), чтобы вы могли использовать его напрямую и проверить, что проблемы, с которыми вы сталкиваетесь, связаны с реализацией Flask, а не с вашим другим кодом rdflib.

...