简而言之:
我在图形数据库(neo4j)中工作
我编写了一个查询,检查字符串中给定位置的两个字符是否相同(当rc1=rc2时……)如果是:移除其中一个。
最后,它将用新字符串创建一个节点
如果在Neo4j桌面上执行查询,效果会非常好
现在,对于这个项目,我需要将查询存储在节点的属性中。
我知道编写一些代码来执行与查询结果相同的逻辑是很容易的,但是查询需要存储在节点中
我编写了一小段python,用于查找正确的节点、收集其属性并执行在其中找到的查询。
当我运行这个代码时,如果一个单词在给定的位置没有两个相同的字符,它会给我一些意想不到的结果。它的作用就好像rc1等于rc2,即使它不等于rc2。
同样,当在Neo4j桌面中执行查询时,它的性能也很好
如果删除带有假字符串的节点并再次运行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桌面上运行此操作将导致:
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的子字符串函数时,一切都很好。
当我换上其中一个时,一切都很好
现在我开始怀疑Python的Neo4j Bolt驱动程序1.7中有一个bug。
我补充说:
WITH split(st1,'') as _st1
并替换子字符串:
WITH _st1[-1] AS rc1, _st1[-2] AS rc2
这似乎解决了我的问题
目前没有回答
相关问题 更多 >
编程相关推荐