![精通Neo4j](https://wfqqreader-1252317822.image.myqcloud.com/cover/113/47216113/b_47216113.jpg)
3.3.21 CALL语句
CALL语句用于调用数据库中的过程(Procedure)。使用CALL语句调用过程时,需要指定所需要的参数。可以通过在过程名的后面使用逗号分隔的列表来显式地指定,也可以使用查询参数来作为过程调用的实参。后者仅适用于在单独的过程调用中作为参数,即整个查询语句只包含一个单一的CALL调用。
大多数的过程返回固定列的记录流,类似于Cypher查询返回的记录流。YIELD子句用于显式地选择返回结果集中的哪些部分并绑定到一个变量以供后续的查询引用。在一个更大的查询内部,过程调用返回的结果可以显式地使用YIELD引入一个WHERE子句来过滤结果(类似WITH …WHERE …)。
Neo4j支持VOID过程。VOID过程既没有声明任何结果字段,也不返回任何结果记录。调用VOID过程可能有一个副作用,就是它既不允许也不需要使用YIELD。在一个大的查询中调用VOID过程,就像WITH *在记录流的作用那样简单地传递输入的每一个结果。
下面的例子显示了如何传递实参并从一个过程中返回结果字段,所有的例子将使用下面的过程:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P199_102813.jpg?sign=1739558136-EGsQ6EQoCOsHwIo2zqpodl42nipXxJCQ-0-647699c6d39a27d4ce5bc656c932d045)
3.3.21.1 调用过程
本例调用数据库内嵌的过程db.labels,它可列出数据库中的所有标签。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P200_92368.jpg?sign=1739558136-I5fMoyZasI9xHAK4s9KjUJ0ACi43BAnQ-0-bd244515054ca0a0553507f8029b8e7c)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P200_92398.jpg?sign=1739558136-SueHMQsKPfVXKZMr7N4hyumsCGwlv74r-0-8dbe8f4d664d3946d0ad3e1e969c1795)
3.3.21.2 使用命名空间和名字调用过程
本例调用数据库内嵌的过程db.labels,它可列出数据库中的所有标签。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P200_92375.jpg?sign=1739558136-Nh3R5Wiho2YWrDOu0AEXDckbMUnnNB5l-0-d763981adeec6f1502e1d670d8f1cac8)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P200_101933.jpg?sign=1739558136-cSi9jXrYAXRRfClJcNBJ82JOrJ0fqtKY-0-040ac6a7e0c1a7f6d2abbc3193dbf58d)
3.3.21.3 使用字面值参数调用过程
下面使用字面值参数调用了例子中的过程org.neo4j.procedure.example.addNodeToIndex,参数直接写在语句中。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P200_92382.jpg?sign=1739558136-RjyV0WTvgZtFxQ3Px7sr43omIukHhnJv-0-bdf92671d235826d8e867fd899e7d1f0)
因为例子中的过程不返回任何结果,因此结果将返回空。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P200_101936.jpg?sign=1739558136-oUd0f9GR2sAZ2yjlOoI4bpGBR4MNqEx3-0-9d54982e644edb8b7000f37ba013cf6c)
3.3.21.4 使用参数作为实参调用过程
这里使用参数作为实参调用了例子中的过程org.neo4j.procedure.example.addNodeToIndex。每个过程的实参所取的值为参数语句中同名的参数对应的值(如果没有这个参数,则值为null)。
参数:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_102815.jpg?sign=1739558136-UdVPc9HKeoCQGhxP1sF72sIJauLA4gar-0-26919036a152bf39c42e55c7e7f2b6ed)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_92425.jpg?sign=1739558136-GnQ2rNJpYFBSXr0DDHGb1gTaKlVEqkti-0-ddb5cb0cdd82e921dfe38cbd0604b2e4)
因为例子中的过程不返回任何结果,因此结果将为空。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_101938.jpg?sign=1739558136-0j0WqolVZQMtRNnsenXR9SVEUNry5qBx-0-955026a3ad3f210ebc79a3049f0f6b8d)
3.3.21.5 混合使用字面值和参数调用过程
这里,混合使用字面值和参数来作为过程的参数来调用例子中的过程org.neo4j.procedure.example.addNodeToIndex。
参数:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_102816.jpg?sign=1739558136-ATgMlJElHBRDhca2KjzIlZZX9tNSMQj6-0-ce335c1d45becd42c11e58fde02ebeae)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_92452.jpg?sign=1739558136-AHTEqnGzHohIRtvNVcrNNkNo7hGoOkVY-0-8b949edf89d7313a9554635b58cfbe37)
因为例子中的过程不返回任何结果,因此结果将为空。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_101941.jpg?sign=1739558136-qYnMdsGKTPbAwIjIaruaWObtORjyBsln-0-7e590a4be9b0bbbea4ddbeaf9275be16)
3.3.21.6 使用字面值和默认实参调用过程
这里使用字面值和过程本身提供的默认值作为参数,调用例子中的过程org.neo4j.procedure.example.addNodeToIndex。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_92459.jpg?sign=1739558136-rD3lj61Y0XFNdN9tC537yTeBUM5XrIxC-0-ddddb15cda2d39783956d388289eb8ff)
因为例子中的过程不返回任何结果,因此结果将为空。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P201_101944.jpg?sign=1739558136-zqI2eXkFS89OFsECDnauR3n6FV04omJT-0-e36da2aa92800c7b22852ae73c08684f)
3.3.21.7 在复杂查询中调用过程
这里调用数据库内嵌的过程db.labels,计算数据库中的总标签数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P202_102820.jpg?sign=1739558136-HXxlyXexVeU6rRWkIcvU9hdHJT9pVcuC-0-8c49919b96f9cf85c6d4451a6b5f8508)
因为过程调用是大的查询的一部分,所以所有的输出都必须显式地命名。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P202_101947.jpg?sign=1739558136-9YRpVBfx6zB4JrpmAVi3tEINVep5Wdwe-0-e48761aa6e90ba1df10f264566bf7478)
3.3.21.8 调用过程并过滤结果
这里调用数据库内嵌的过程db.labels,并计算数据库中所有在用的包含“User”词的标签。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P202_102821.jpg?sign=1739558136-po31p0CbdxUl2XhmJyS0I1SmqQJOuMGM-0-aac019ec4a4d4ad428777bc94bc01e1b)
因为过程调用是大的查询的一部分,所以所有的输出都必须显式地命名。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P202_101950.jpg?sign=1739558136-LxCJd2zpka2lTCV52fZUqbzLgS5DMr5I-0-dbedc269357fbc784c4de22758a5df9b)
3.3.21.9 在复杂查询中调用过程并重命名结果
这里调用内嵌过程db.propertyKeys作为一部分,计算数据库中包含每个属性键的节点数。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P202_102822.jpg?sign=1739558136-XOvMwu82E7WwUzFDipobPC56AnbEV4o1-0-a79fb9b85b70e8dab75fb97b8cadd99f)
因为过程调用是大的查询的一部分,所以,所有的输出都必须显式地命名。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P202_102823.jpg?sign=1739558136-vXz5uRQK5aOswfq8ZKzKDIeo5TNpPVrb-0-1804cde4f3d34d0a2dfb5316aace88ca)