相同的 python 代码在 FLASK 和 CLI 脚本中的工作方式不同
same python code works different in FLASK and CLI script
我正在 运行 在 python 脚本中编写代码,在烧瓶 api 中编写代码。问题是将 rdf 三元组添加到 rdflib 图。如果我 运行 它在由解释器解析的命令行脚本中工作。如果我 运行 烧瓶中的相同代码 api 它会忽略一些逻辑。代码是:
烧瓶
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 脚本
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 添加三元组,在另一种情况下不添加。
根据 Victor 的评论,rdflib 可能会在 7 月之前完全放弃 Python 2 支持。
此外,我建议使用 完全 与 Helper() class 相同的脚本代码,因此请将 if __name__ == '__main__:
添加到您的 Helper()
class 文件,以便您可以直接使用它并测试您看到的问题是否与 Flask 实现有关,而不是您不同的 rdflib 代码。
这个问题与您必须指定比较的文字的数据类型这一事实有关。 RDFLIB SPARQL Parser 不是比较整数或一般数字,而是比较字符串,从而产生意外行为。我相信现在这不是 rdflib 问题,而是 SPARQL 问题,它需要严格的类型声明。添加:g.query(query, initBindings{?start : Literal^^xsd:Integer}
解决了问题!
我正在 运行 在 python 脚本中编写代码,在烧瓶 api 中编写代码。问题是将 rdf 三元组添加到 rdflib 图。如果我 运行 它在由解释器解析的命令行脚本中工作。如果我 运行 烧瓶中的相同代码 api 它会忽略一些逻辑。代码是:
烧瓶
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 脚本
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 添加三元组,在另一种情况下不添加。
根据 Victor 的评论,rdflib 可能会在 7 月之前完全放弃 Python 2 支持。
此外,我建议使用 完全 与 Helper() class 相同的脚本代码,因此请将 if __name__ == '__main__:
添加到您的 Helper()
class 文件,以便您可以直接使用它并测试您看到的问题是否与 Flask 实现有关,而不是您不同的 rdflib 代码。
这个问题与您必须指定比较的文字的数据类型这一事实有关。 RDFLIB SPARQL Parser 不是比较整数或一般数字,而是比较字符串,从而产生意外行为。我相信现在这不是 rdflib 问题,而是 SPARQL 问题,它需要严格的类型声明。添加:g.query(query, initBindings{?start : Literal^^xsd:Integer}
解决了问题!