自定义顶点 ID
JanusGraph有一个内置的ID管理器,它为顶点、边和属性分配唯一的ID。默认情况下,所有这些ID都是长整型数字,但JanusGraph允许您定义自定义顶点ID。
配置
您可以使用两个布尔选项:graph.set-vertex-id和graph.allow-custom-vid-types。一旦启用第一个选项,您在创建顶点时将能够且必须提供一个顶点ID。顶点ID必须是长整型,除非您打开第二个选项。第二个选项允许您提供长整型ID或字符串类型ID。请注意,如果您打开graph.allow-custom-vid-types,您也必须打开graph.set-vertex-id。
这两个选项都是GLOBAL_OFFLINE,默认值为false。全局离线意味着一旦它们被设置,您将不得不关闭整个JanusGraph集群才能更改值。请参阅以下两种情况。
创建一个新的图
只需在配置文件中设置graph.set-vertex-id=<true/false>和graph.allow-custom-vid-types=<true/false>。当图创建时,此值将被加载并持久化。图创建后,更改配置文件中的选项值将不起作用,因为JanusGraph会直接忽略该值。
修改现有图
要更改全局离线配置(不限于上述两个选项),您需要关闭所有JanusGraph实例。然后打开gremlin控制台,连接到JanusGraph实例并运行以下命令
mgmt = graph.openManagement();
mgmt.set("graph.set-vertex-id", true);
// optional, if you want to provide string ID
mgmt.set("graph.allow-custom-vid-types", true);
mgmt.commit();
如果您有打开的JanusGraph实例,它将返回一个错误。否则,它将成功,现在您的全局配置应该已更新。
自定义长整型ID
要提供一个长整型顶点ID,您必须调用graph.getIDManager().toVertexId(long)来检索转换后的JanusGraph ID。输入的数字必须是正数。这是因为某些范围的长整型ID被保留用于内部使用,所以您必须始终调用上述实用工具来转换您的ID。不幸的是,这并非所有Gremlin客户端都支持,因为它是一个JanusGraph特有的实用工具。您可以按如下方式创建顶点
g = graph.traversal()
g.addV().property(T.id, graph.getIDManager().toVertexID(123L)).next()
g.tx().commit()
请注意,如果您想取回您提供的原始ID,您需要调用graph.getIDManager().fromVertexID(long)。
自定义字符串ID
只要底层存储和索引后端允许,字符串顶点ID可以有任意长度。例如,Elasticsearch要求ID的长度小于或等于512。
字符串值必须仅由可打印的ASCII字符组成,并且不能包含JanusGraph保留的关系分隔符(一个单字符字符串)。默认情况下,此保留分隔符是-(破折号),这意味着您不能使用UUID字符串作为顶点ID,因为它包含-字符。您可以按如下方式创建顶点
g = graph.traversal()
g.addV().property(T.id, "custom_vid_001").next()
g.tx().commit()
覆盖保留字符
如果您创建新图(使用1.0.0或更高版本),JanusGraph允许您设置JANUSGRAPH_RELATION_DELIMITER系统属性,这是一个单字符字符串,可以是任何可打印的ASCII字符。一旦设置,JanusGraph将禁止使用该特定字符,而不是默认的-字符。或者,您可以设置JANUSGRAPH_RELATION_DELIMITER环境变量,它仅当JANUSGRAPH_RELATION_DELIMITER系统属性不存在时才会被评估。例如,您可以在打开Gremlin控制台时使用以下命令设置系统属性
JAVA_OPTIONS="-DJANUSGRAPH_RELATION_DELIMITER=@" ./bin/gremlin.sh
然后您应该能够使用UUID作为自定义ID,因为现在保留字符变为@而不是-。
g = graph.traversal()
g.addV().property(T.id, UUID.randomUUID().toString()).next()
g.addV().property(T.id, "custom-vid-001").next()
g.tx().commit()
警告
如果您决定替换默认的JANUSGRAPH_RELATION_DELIMITER,您必须在图的整个生命周期中,在所有JanusGraph实例(包括服务器和客户端)上始终一致地设置系统属性或环境变量。否则,可能会发生数据损坏。例如,如果您只在客户端设置它,那么服务器将无法因为设置不匹配而反序列化任何属性或边。此外,您不得在旧版图上使用此设置。换句话说,您不能在任何时候更改此属性。