Cypher:哪个赋值运算符

时间:2017-11-12 12:08:46

标签: neo4j cypher

我很欣赏一些特定于Cypher的理论,因为有效地说,为什么语言中有两个不同的赋值运算符。我可以让事情发挥作用,但感觉缺少某些东西......

让我们使用Neo4j的电影数据库,并提供以下查询:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, oauth2_provider, sessions
Running migrations:
  Applying oauth2_provider.0004_auto_20160525_1623...Traceback (most recent call last):
  File "/Users/lr/lrapp1/manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 204, in handle
    fake_initial=fake_initial,
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/migrations/executor.py", line 115, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/migrations/migration.py", line 129, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 216, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 515, in alter_field
    old_db_params, new_db_params, strict)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 572, in _alter_field
    index_names = self._constraint_names(model, [old_field.column], index=True, type_=Index.suffix)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 1003, in _constraint_names
    if type_ is not None and infodict['type'] != type_:
KeyError: 'type'

当然,查询有效,但这就是我的问题:'kr','hw'和'p'都是变量,对吧?但是为什么前两个被分配了一个冒号,但后者是一个相同的符号呢?

感谢。

2 个答案:

答案 0 :(得分:2)

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

节点标签和关系类型始终以:开头,即使根本没有变量也是如此。这有助于区分节点标签或关系类型与变量(变量永远不会以:开头),:自然地充当标签/类型和变量之间的分隔符当下。也可以在节点或标签上有变量,但省略类型......在这种情况下,不存在:,这再次强调它与赋值没有任何关系。

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

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

答案 1 :(得分:1)

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

在很多方面,图形实例非常类似于release notes(以及其他常见表示),您可以使用name : type来表示对象的变量名称和类型(类)或者只使用: type来表示匿名实例。

现在路径并不适合那张照片。在白板上,我只是将相关部分放在虚线/圆圈区域中,在其旁边写上pp=。绝对不是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 (a)-[rs:REL*]->(b)
                 ^

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

MATCH p=(a)-[:REL*]->(b)
RETURN relationships(p)

备注2。我来自OO背景,并且已经写了几年Cypher,所以可能只是我习惯了语法 - 对于新手来说可能很奇怪,特别是来自不同的领域。

备注3. openCypher项目现在提供语法规范 relationships,可让您深入了解如何解析