技术限制
在使用 JanusGraph 时,应该注意各种限制和“陷阱”。其中一些限制是必要的设计选择,另一些则是随着 JanusGraph 开发的继续而将得到纠正的问题。最后,最后一节提供了常见问题的解决方案。
设计限制
这些限制反映了长期的权衡设计,这些权衡要么难以改变,要么不切实际。这些限制在不久的将来不太可能被移除。
大小限制
JanusGraph 可以存储多达一百万亿条边 (2^60) 和一半数量的顶点。这个限制是由 JanusGraph 的 ID 方案造成的。
数据类型定义
当使用 dataType(Class) 声明属性键的数据类型时,JanusGraph 将强制该键的所有属性都具有声明的类型,除非该类型是 Object.class。这是一个相等类型检查,意味着不允许子类。例如,不能将数据类型声明为 Number.class 并使用 Integer 或 Long。出于效率考虑,类型需要精确匹配。因此,为了类型灵活性,请使用 Object.class 作为数据类型。在所有其他情况下,请声明实际数据类型以受益于提高的性能和类型安全性。
边检索是 O(log(k))
通过 ID 检索边,例如 tx.getEdge(edge.getId()),不是一个常数时间操作,因为它需要对其相邻顶点之一进行索引调用。因此,通过其 ID 检索单个边的成本是 O(log(k)),其中 k 是相邻顶点上的关联边数量。JanusGraph 将尝试选择度数较小的相邻顶点。
这也适用于通过标准或外部索引进行边的索引检索。
类型定义不可更改
一旦提交到图中,边标签、属性键或顶点标签的定义就无法更改。但是,类型可以在运行时重命名,并且可以创建新类型以适应不断演变的模式。
保留关键字
JanusGraph 内部用于类型的一些关键字不能以其他方式使用。这些类型包括顶点标签、边标签和属性键。以下是不能使用的关键字:
-
vertex
-
element
-
edge
-
property
-
label
-
key
例如,如果尝试创建带有 property 标签的顶点,将收到关于受保护系统类型的异常。
临时限制
这些是 JanusGraph 当前实现中的限制。这些限制可能会在即将发布的 JanusGraph 版本中合理地移除。
混合索引支持有限
混合索引仅支持 JanusGraph 支持的数据类型的子集。请参阅混合索引数据类型以获取当前列表。此外,混合索引目前不支持具有 SET 或 LIST 基数的属性键。
批量加载速度
JanusGraph 提供了一种批量加载模式,可以通过图配置启用。然而,这种批量模式只促进更快地加载到存储后端,它不使用存储后端特定的批量加载技术来在内存中准备数据以进行磁盘存储。因此,JanusGraph 中的批量加载目前比单机数据库提供的批量加载模式要慢。批量加载包含有关加快 JanusGraph 中批量加载的信息。
与批量加载相关的另一个限制是无法一次性或在短时间内将数百万条边加载到单个顶点中。这种**超级节点加载**可能会导致某些存储后端失败。此限制也适用于密集索引条目。