本来不想发一些小水帖,但是这个问题我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")