执行存储在节点属性

时间:2019-06-20 22:49:10

标签: python neo4j

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

这似乎解决了我的问题。

0 个答案:

没有答案