Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 塞弗:哪个赋值运算符_Neo4j_Cypher - Fatal编程技术网

Neo4j 塞弗:哪个赋值运算符

Neo4j 塞弗:哪个赋值运算符,neo4j,cypher,Neo4j,Cypher,我希望了解一些特定于密码的理论,了解为什么语言中有两种不同的赋值运算符。我可以让事情顺利进行,但感觉好像少了什么 让我们通过以下查询使用Neo4j的电影数据库: match (kr:Person {name:"Keanu Reeves"}), (hw:Person{name:"Hugo Weaving"}), p=shortestPath((kr)-[*]-(hw)) return p 当然,查询是有效的,但我的问题是:‘kr’、‘hw’和‘p’都是变量,对吗?但为什么前两个用冒号表示,后一个

我希望了解一些特定于密码的理论,了解为什么语言中有两种不同的赋值运算符。我可以让事情顺利进行,但感觉好像少了什么

让我们通过以下查询使用Neo4j的电影数据库:

match (kr:Person {name:"Keanu Reeves"}), (hw:Person{name:"Hugo Weaving"}), p=shortestPath((kr)-[*]-(hw)) return p
当然,查询是有效的,但我的问题是:‘kr’、‘hw’和‘p’都是变量,对吗?但为什么前两个用冒号表示,后一个用等号表示


谢谢。

我认为这没有深刻的理论原因。Cypher最初的想法是提供一种ASCII艺术风格的语言,
匹配查询的
部分,它类似于您在白板上绘制的图形模式

在许多方面,图实例与(和其他常见表示法)非常相似,在图实例中,您可以使用
名称:类型
来表示对象的变量名称和类型(类),或者只使用
:类型
来表示匿名实例

现在,路径并不真正适合这种情况。在白板上,我只是将相关部分放在一个虚线/圆圈区域,并在其旁边写入
p
p=
。绝对不是
p:

请注意,可以将查询重新表述为更紧凑的形式:

match p=shortestPath((kr:Person {name:"Keanu Reeves"})-[*]-(hw:Person {name:"Hugo Weaving"}))
return p
在这里,到处使用冒号看起来不合适,想想:
p:shortestPath((kr:Person{name:“Keanu Reeves”})

备注1。如果您试图使用变量捕获可变长度模式的关系,您将收到警告:

警告。此功能已弃用,将在将来的版本中删除

不推荐使用可变长度模式中与列表的绑定关系。(org.neo4j.graphdb.impl.notification.NotificationDetail$Factory)$2@1eb6644d)

因此,最好使用路径和函数来获得相同的结果:

MATCH p=(a)-[:REL*]->(b)
RETURN relationships(p)
备注2。我有OO背景,已经写了几年的密码,所以可能是我习惯了语法——这对新手来说可能很奇怪,尤其是来自不同领域的人

备注3。openCypher项目现在提供了语法规范
,这使您能够深入了解如何解析。

需要注意的是,用于节点和关系的
实际上与变量赋值没有任何关系,而是与节点标签和关系类型相关联

节点标签和关系类型始终以
开头,即使根本不存在变量。这有助于区分节点标签或关系类型与变量(变量永远不会以
开头),并且当标签/类型和变量同时存在时,
自然充当两者之间的分隔符。也可以在节点或标签上有一个变量,但忽略类型…在这种情况下,将不存在
,这再次强调了它与赋值无关

在映射
{}
的上下文中(例如属性映射,包括在节点或关系上的匹配中内联时),则
用于映射键/值对,并且是常见语法,用于JSON表示


实际赋值(例如在SET子句中,以及在您将path变量设置为匹配中的模式的示例中)使用
=

非常有趣;确实非常感谢。我明白您的意思。因此,没有“理论”,这只是一个经验规则,我们在节点前使用冒号,在路径前使用等号。这就是你总结的方式吗?是的,准确地说。还要注意,这两个字符都用于值比较:
MATCH(kr:Person{name:“Keanu Reeves”})RETURN kr
编译为与
MATCH(kr:Person)完全相同的查询计划其中kr.name=“Keanu Reeves”返回kr
。明白了。这很好地补充了Gabor的答案。因此,与等号相反,冒号只是JSON式ASCII艺术的一部分,因为可以有:类型(不带变量)或悬挂变量(如匹配中的(n)非常感谢。如果你收到满意的答复,请在其中的一个上注明接受。谢谢。
MATCH p=(a)-[:REL*]->(b)
RETURN relationships(p)