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”,这样您就可以读入它了。
我正在使用以下方法导出图表:
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”,这样您就可以读入它了。