NumberFormatException 的 Tinkerpop graphml() 导出问题

Tinkerpop graphml() export issue with NumberFormatException

我正在使用以下方法导出图表:

graph.io(IoCore.graphml()).writer().normalize(true).create().writeGraph(new FileOutputStream("/tmp/graph.xml"), graph)

结果我得到了一个 XML 节点,如下所示:

<node id="01351655-3a28-492b-961f-94af629a037b">
            <data key="labelV">Appointment</data>
            <data key="created_onV">1588976206654</data>
            <data key="duration">61200000</data>
            <data key="name">123</data>
            <data key="timestamp_begin">1588716000000</data>
            <data key="timestamp_end">1588777200000</data>
            <data key="type">OPEN</data>
            <data key="updated_by">d522c7c7-d15e-4b6a-bdea-0866efb2ce4a</data>
            <data key="updated_onV">1588977412981</data>
        </node>

我获取了 XML 文件并尝试使用以下方法将其导入空数据库:

graph.io(IoCore.graphml()).reader().create().readGraph(new FileInputStream("/tmp/graph.xml"), graph)

现在在 Gremlin 服务器控制台中出现以下异常:

java.lang.NumberFormatException: For input string: "1588716000000"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Integer.parseInt(Integer.java:652)
        at java.base/java.lang.Integer.valueOf(Integer.java:983)
        at org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader.typeCastValue(GraphMLReader.java:324)
        at org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader.readGraph(GraphMLReader.java:150)

需要做些什么才能让它发挥作用?我知道这里的类型有问题。最重要的是我毕竟没有修改导出的XML。

可能 GraphMLWriter 没有正确识别数字 属性 键的输入范围。作者通过简单地读取所有顶点的所有 属性 键然后检查为每​​个键找到的第一个值的类型来确定类型。在您的情况下,找到的第一个值可能是一个整数,但实际上应该已经解决了很长时间。如果您想避免此类问题(更不用说代价高昂,因为动态确定类型本质上需要全图扫描),您可以选择将 edgeKeyTypes(Map)vertexKeyTypes(Map) 指定为 [= 的一部分14=].

gremlin> writer = GraphMLWriter.build().vertexKeyTypes([name:"string",age:"long"]).create()
==>org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLWriter@7d0cd23c
gremlin> g.io("graph.xml").with(IO.writer, writer).write().iterate()
gremlin>

显然,您可以编辑现有的 GraphML 文件以将类型切换为“long”,这样您就可以读入它了。