执行存储在节点属性中的查询时出现意外行为

2024-05-21 11:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

简而言之:
我在图形数据库(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

这似乎解决了我的问题


Tags: 字符串namesizeasrc1withsubstringend