py2neo.database.ClientError: SyntaxError: Invalid input、py2neo.internal.hydration.HydrationError

本来不想发一些小水帖,但是这个问题我bug了好久,网上的回复帖也很少,专门记录一下。
关于py2neo的那些雷区:

1. match匹配

解决帖来源:neo4j和py2neo不同版本导致的match语句无法执行
这段代码在我电脑上跑不通:

zzu1 = graph.nodes.match("school", name="zzu").first()

修改成这样就可以:

zzu1 = graph.nodes.match('school').where("_.name='zzu'").first()

还有一个match的例子,我不知道为啥能跑通。这个例子和上面的例子实现的是同一个功能,都是在label标签中找到name属性值为zzu的结点:

zzu2 = graph.run("MATCH(a:school) WHERE a.name = 'zzu' RETURN a").data()

在参考的那个帖子中提到,match中使用变量可能也会出现莫名奇妙的bug,可能因为我没有用match,所以下面这种格式的代码并没有报错:(就是正常的对字符串进行format使用)

verb = "located"
noun = "zzu"
city1 = graph.run("match(a:school)-[r:{v}]->(b:city) WHERE a.name = '{n}' RETURN b".format(v=verb, n=noun)).data()

2. 空格

解决帖来源:neo4j 出现error py2neo.database.work.ClientError [Statement.SyntaxError] Invalid input ‘W‘ expected ‘
上面这个帖子遇到的问题是字符串包含非法符号,也就是invalid input。我的这段代码也遇到了问题:

city1 = graph.run("match(a:school)-[r:is located in]->(b:city) WHERE a.name = 'zzu' RETURN b").data()

is located in是报错点,很明显是空格的问题。但是我输入空格的转义字符’\0’后仍无法解决。无奈之下只好将这段关系改名为located,就解决了问题:

city1 = graph.run("match(a:school)-[r:located]->(b:city) WHERE a.name = 'zzu' RETURN b").data()

3 大小写

利用知识图谱检索时,定义的类一定要大写,下面的检索代码把Movie换成movie就不行了。不过如果是中文知识图谱就没有问题,很奇怪。

class Movie(Model):
    __primarykey__ = "name"
    name = Property()
    DIRECT = RelatedTo("Director")
    
class Director(Model):
    __primarykey__ = "name"
    name = Property()
    DIRECT = RelatedFrom("Movie")
    
# noun = ...
keanu = repo.match(Movie).where(name=noun).first()
if keanu:   # 如果该名词在知识图谱内
	s = list(keanu.DIRECT.triples())[0][2]
	s = str(s).split("'")[1].replace("_", " ")
	print("Let me see...The director of {m} is {d}".format(m=noun, d=s))
	break
else:
	print("none")

4 待补充

你可能感兴趣的:(bugs,py2neo,知识图谱)