常见问题
意外的类型创建
默认情况下,JanusGraph 会在遇到新类型时自动创建属性键和边标签。强烈建议用户在加载任何数据之前,按照模式和数据建模中的文档明确定义模式,并通过设置选项 schema.default = none 来禁用自动类型创建。
自动类型创建可能会在多线程或高并发环境中导致问题。由于 JanusGraph 需要确保类型是唯一的,多次尝试创建相同类型将导致锁定或其他异常。通常建议在需要新的属性键和边标签时,提前或一次性创建所有必需的类型。
自定义类数据类型
JanusGraph 支持将任意对象作为属性的属性值。要将自定义类用作 JanusGraph 中的数据类型,请注册自定义序列化器,或确保该类具有无参数构造函数并实现 equals 方法,因为 JanusGraph 将验证它是否可以成功地对该类的对象进行反/序列化。有关更多信息,请参阅数据类型和属性序列化器配置。
边的事务范围
不应在创建或检索边的范围之外访问边。
锁定异常
在使用启用锁定(即请求 JanusGraph 确保唯一性)的唯一类型时,在并发修改图时很可能会遇到 PermanentLockingException 类型的锁定异常。
此类异常是预期的,因为 JanusGraph 无法知道如何从事务状态中恢复,在该状态下,早期的读取值已被另一个事务修改,因为这可能会使事务状态无效。在大多数情况下,只需重新运行事务即可。如果锁定异常非常频繁,请尝试分析并消除拥塞源。
幽灵顶点
当在同一个事务中同时删除一个顶点并在另一个事务中修改它时,两个事务都将在最终一致的存储后端上成功提交,并且该顶点仍将存在,只包含修改后的属性或边。这被称为幽灵顶点。可以使用键唯一性来防止最终一致后端上的幽灵顶点,但这在大多数情况下成本过高。一种更具可扩展性的方法是暂时允许幽灵顶点并定期清除它们。
另一个选项是使用事务配置中记录的选项 checkInternalVertexExistence() 在读取时检测它们。
调试级别日志记录减慢执行速度
当日志级别设置为 DEBUG 时,JanusGraph 会生成大量日志输出,这对于理解特定查询如何编译、优化和执行很有用。然而,输出量非常大,以至于会显著影响查询性能。因此,对于生产系统或基准测试,请使用 INFO 严重性或更高。
JanusGraph OutOfMemoryException 或过度的垃圾回收
如果您在运行 JanusGraph 时遇到内存问题或过度垃圾回收,则可能是缓存配置不正确。如果缓存太大,堆可能会被缓存条目填满。在调整数据库级别缓存之前,请尝试减少事务级别缓存的大小,尤其是当您有许多并发事务时。有关更多信息,请参阅JanusGraph 缓存。
Elasticsearch OutOfMemoryException
当大量客户端连接到 Elasticsearch 时,很可能会发生 OutOfMemoryException。这并非由于内存问题,而是由于操作系统不允许用户(运行 Elasticsearch 的用户)生成更多线程。为了解决此问题,请增加允许用户运行 Elasticsearch 的进程数。例如,将 ulimit -u 从默认的 1024 增加到 10024。
删除数据库
要使用 Gremlin Console 删除数据库,可以调用 JanusGraphFactory.drop(graph)。您要删除的图需要在运行 drop 方法之前定义。
使用 ConfiguredGraphFactory
graph = ConfiguredGraphFactory.open('example')
ConfiguredGraphFactory.drop('example');
使用 JanusGraphFactory
graph = JanusGraphFactory.open('path/to/configuration.properties')
JanusGraphFactory.drop(graph);
请注意,在 0.3.0 之前的 JanusGraph 版本中,如果多个 Gremlin Server 实例连接到已删除的图,建议通过运行 JanusGraphFactory.close(graph) 或 ConfiguredGraphFactory.close("example") 来关闭所有活动节点上的图,具体取决于使用的图管理器。关闭并重新打开所有活动节点上的图将防止对已删除图的缓存(过时)引用。已删除的 ConfiguredGraphFactory 图可能需要使用图配置单例或模板配置重新创建其配置。