简而言之:
我在图数据库(neo4j)中工作
我写了一个查询,检查在给定位置的字符串中的2个字符是否相同。 (当rc1 = rc2然后...时)如果是这样,请删除其中之一。
最后,它将使用新字符串创建一个节点。
如果在Neo4j Desktop中执行查询,则效果很好。
现在对于该项目,我需要将查询存储在节点的属性中。
我知道编写一些与查询结果执行相同逻辑的代码会很容易,但是查询需要存储在节点中。
我写了一小段python,可以找到正确的节点,收集其属性并执行在其中找到的查询。
当我运行此代码时,如果给定位置的单词没有两个相同的字符,它会给我带来一些意想不到的结果。即使rc1等于rc2,它的作用也一样。
同样,在Neo4j Desktop中执行查询时,查询效果很好。
知道如果我删除带有错误字符串的节点并再次运行python部分,结果可能是正确的。
现在,首先查询。我已经省略了它创建新节点的部分,因为那不相关。
MATCH (w:Word{name:'buigen'})
WITH substring(w.name,size(w.name)-2,2) AS ex1, left(w.name,size(w.name)-2) AS st1,w
WITH substring(st1, size(st1)-1 , 1) AS rc1,
CASE WHEN size(st1)>1 THEN substring(st1, size(st1)-2 , 1)
ELSE null
END AS rc2,
CASE WHEN size(st1)>2 THEN substring(st1, size(st1)-3 , 1)
ELSE null
END AS rc3,st1,ex1,w
WITH
CASE WHEN ex1 = 'en' THEN
CASE WHEN rc1=rc2 THEN left(st1,size(st1)-1)
ELSE st1
END
WHEN ex1 = 'ën' THEN st1 + 'e'
END as xn,rc3,rc2,rc1
RETURN xn,rc3,rc2,rc1
在Neo4j Desktop中运行此命令会导致:
xn = "buig"
st1 = "buig"
rc1 = "g"
rc2 = "i"
到目前为止很好。
现在是python片段:
from neo4j import GraphDatabase
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("****", "*******"))
# skipped some code
def find_and_execute(*args, **kwargs):
# skipped some code
action = fquery
print(action)
with driver.session() as session:
try:
for record in session.run(action, var_word=frequiredVal):
print(record)
except:
print('oops 2')
执行时:
a.find_and_execute(rule='stam',var_word='buigen')
它导致:
MATCH (w:Word{name:{var_word}}) WITH substring(w.name,size(w.name)-2,2) AS ex1, left(w.name,size(w.name)-2) AS st1,w WITH substring(st1, size(st1)-1 , 1) AS rc1, CASE WHEN size(st1)>1 THEN substring(st1, size(st1)-2 , 1) ELSE null END AS rc2,st1, ex1, w WITH CASE WHEN ex1 = 'en' THEN CASE WHEN rc1 = rc2 THEN left(st1,size(st1)-1) ELSE st1 END WHEN ex1 = 'ën' THEN st1 + 'e' END as xn,st1,rc2,rc1 RETURN xn,st1,rc2,rc1
<Record xn='bui' st1='buig' rc2='i' rc1='g'>
如您所见,xn =“ bui”应该在其中“ buig”
我真的不知道为什么会发生这种情况(duh),但是我也用尽了所有的想法来调试它。
欢迎任何帮助!
编辑:
找到了一种解决方法(也许更优雅):
当我用字符串('g','i')替换rc1和rc2的子字符串函数时,一切正常。
当我更换它们时,一切都很好
现在,我开始怀疑Neo4j Bolt Driver 1.7 for Python中的错误。
我加了:
WITH split(st1,'') as _st1
,并将子字符串替换为:
WITH _st1[-1] AS rc1, _st1[-2] AS rc2
这似乎解决了我的问题。