常见问题FAQ
本文列出了使用Nebula Graph时可能遇到的常见问题,您可以使用文档中心或者浏览器的搜索功能查找相应问题。
如果按照文中的建议无法解决问题,请到Nebula Graph论坛提问或提交GitHub issue。
关于本手册
为什么手册示例和系统行为不一致?
Nebula Graph 2.0一直在持续开发,功能或操作的行为可能会有变化,如果您发现不一致,请提交issue通知Nebula Graph团队。
???+ faq “如果您发现发现本文档中的错误”
1. 您可以点击页面顶部右上角的”铅笔”图标进入编辑页面。 2. 使用 Markdown 修改文档。完成后点击页面底部的 “Commit changes”,这会触发一个 GitHub pull request。 3. 完成CLA签署,并且至少2位reviewer审核通过即可合并。
关于历史兼容性
关于openCypher兼容性
nGQL兼容openCypher 9吗?
nGQL部分兼容openCypher 9。
在Nebula Graph Issues中已经列出已知的不兼容项。如果您发现这种类型的新问题,请提交问题并附带incompatible
标签。您可以通过关键字compatibility
搜索兼容性问题。
下面是nGQL和openCypher 9的主要差异(由于设计原因而不兼容)。
类别 | openCypher 9 | nGQL |
---|---|---|
Schema | 弱Schema | 强Schema |
相等运算符 | = | == |
数学求幂 | ^ | 使用pow(x, y) 替代^ |
边rank | 无此概念 | 用@rank 设置 |
语句 | - | 不支持openCypher 9的所有DML语句(CREATE 、MERGE 等)和部分MATCH 语句。 |
说明:请注意openCypher 9和Cypher在语法和许可上有一些不同。例如Cypher要求所有Cypher语句必须显式地在一个事务中执行,而openCypher没有这样的要求。另外,nGQL暂不支持事务。
哪里可以找到更多nGQL的示例?
您可以在Nebula Graph GitHub的features目录内查看超过2500条nGQL示例。
features目录内包含很多.features格式的文件,每个文件都记录了使用nGQL的场景和示例。例如:
Feature: Match seek by tag
Background: Prepare space
Given a graph with space named "basketballplayer"
Scenario: seek by empty tag index
When executing query:
"""
MATCH (v:bachelor)
RETURN id(v) AS vid
"""
Then the result should be, in any order:
| vid |
| 'Tim Duncan' |
And no side effects
When executing query:
"""
MATCH (v:bachelor)
RETURN id(v) AS vid, v.age AS age
"""
Then the result should be, in any order:
| vid | age |
| 'Tim Duncan' | 42 |
And no side effects
示例中的关键字说明如下。
关键字 | 说明 |
---|---|
Feature | 描述当前文档的主题。 |
Background | 描述当前文档的背景信息。 |
Given | 描述执行示例语句的前提条件。 |
Scenario | 描述具体场景。如果场景之前有@skip 标识,表示这个场景下示例语句可能无法正常工作,请不要在生产环境中使用该示例语句。 |
When | 描述要执行的nGQL示例语句。 |
Then | 描述执行When 内语句的预期返回结果。如果您的返回结果和文档不同,请提交issue通知Nebula Graph团队。 |
And | 描述执行When 内语句的副作用。 |
@skip | 跳过这个示例。通常表示测试代码还没有准备好。 |
欢迎您增加更多实用场景示例,成为Nebula Graph贡献者。
关于数据模型
Nebula Graph支持 W3C 的RDF(SPARQL 或 GraphQL)吗?
不支持。
Nebula Graph的数据模型是属性图,是一个强Schema系统,不支持RDF标准。
Nebula Graph的查询语言也不支持SPARQL和GraphQL。
关于执行
返回消息中time spent
的含义是什么?
将命令SHOW SPACES
返回的消息作为示例:
nebula> SHOW SPACES;
+-------------------+
| Name |
+-------------------+
| basketballplayer |
+-------------------+
Got 1 rows (time spent 1235/1934 us)
第一个数字
1235
表示数据库本身执行该命令花费的时间,即查询引擎从客户端接收到一个查询,然后从存储服务器获取数据并执行一系列计算所花费的时间。第二个数字
1934
表示从客户端角度看所花费的时间,即从客户端发送请求、接收结果,然后在屏幕上显示结果所花费的时间。
可以在CREATE SPACE
时设置replica_factor
为偶数(例如设置为2)吗?
不要这样设置。
Storage服务使用Raft协议(多数表决),为保证可用性,要求出故障的副本数量不能达到一半。
如果replica_factor=2
,当其中一个副本故障时,就会导致系统无法工作;如果replica_factor=4
,只能有一个副本可以出现故障,这和replica_factor=3
是一样。以此类推,所以replica_factor
设置为奇数即可。
建议您在生产环境中设置replica_factor=3
,测试环境中设置replica_factor=1
,不要使用偶数。
如何处理报错[ERROR (-7)]: SyntaxError: syntax error near
?
大部分情况下,查询语句需要有YIELD
或RETURN
,请检查您的查询语句是否包含。
如何统计每种Tag有多少个点,每个边类型有多少条边?
请参见show-stats。
如何获取每种Tag的所有点,或者每种边类型的所有边?
- 建立并重建索引
> CREATE TAG INDEX i_player ON player();
> REBUILD TAG INDEX i_player;
- 使用
LOOKUP
或MATCH
语句。例如:
> LOOKUP ON player;
> MATCH (n:player) RETURN n;
Error can’t solve the start vids from the sentence
查询引擎需要知道从哪些VID开始图遍历. 这些开始(图遍历)的VID,或者通过用户指定,例如
> GO FROM ${vids} ...
> MATCH (src) WHERE id(src) == ${vids}
# 开始图遍历的VID通过如上办法指定
或者通过一个(属性)索引来得到,例如
# CREATE TAG INDEX i_player ON player(name(20));
# REBUILD TAG INDEX i_player;
> LOOKUP ON player WHERE player.name == "abc" | ... YIELD ...
> MATCH (src) WHERE src.name == "abc" ...
# 通过点属性name的索引,来得到VID
否则,就会抛出这样一个异常 can’t solve the start vids from the sentence
。
Error Storage Error: The VID must be a 64-bit integer or a string.
检查输入的 vid 是否是 create space 设置的整型或者 fix_string(N)
. 如果是字符串类型,检查长度是否超过N
(默认为 8
). 见create space.
关于运维
日志文件过大时如何回收日志?
Nebula Graph使用 glog 打印日志。glog 没有日志回收的功能,您可以使用 crontab 设置定期任务回收日志文件,详情请参见Glog should delete old log files automatically。
如何查看Nebula Graph版本
使用
<binary_path> --version
命令查看相应服务二进制文件的Git commit ID。例如,要查看Graph服务的版本,进入Graph服务对应的二进制文件
nebula-graphd
所在目录,运行./nebula-graphd --version
。$ ./nebula-graphd --version
nebula-graphd version Git: ab4f683, Build Time: Mar 24 2021 02:17:30
This source code is licensed under Apache 2.0 License, attached with Common Clause Condition 1.0.
在GitHub commits页搜索该commit ID,获取commit的提交时间。
对比commit提交时间和GitHub Releases页的版本发布时间,即可确定Nebula Graph的版本。
关于本手册
为什么手册示例和系统行为不一致?
Nebula Graph 2.0一直在持续开发,功能或操作的行为可能会有变化,如果您发现不一致,请提交issue通知Nebula Graph团队。
关于连接
防火墙中需要开放哪些端口
如果没有修改过配置文件中预设的端口,请在防火墙中开放如下端口:
服务类型 | 端口 |
---|---|
Meta | 9559, 9560, 19559, 19560 |
Graph | 9669, 19669, 19670 |
Storage | 9777 ~ 9780, 19779, 19780 |
如果修改过配置文件中预设的端口,请找出实际使用的端口并在防火墙中开放它们。
如何测试端口是否已开放
您可以使用如下telnet命令检查端口状态:
telnet <ip> <port>
说明: 如果无法使用telnet命令,请先检查主机中是否安装并启动了telnet。
示例:
// 如果端口已开放:
$ telnet 192.168.1.10 9669
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
// 如果端口未开放:
$ telnet 192.168.1.10 9777
Trying 192.168.1.10...
telnet: connect to address 192.168.1.10: Connection refused