如何让TinkerPop3识别GraphML中的自定义边标签
解决TinkerPop3加载GraphML时边标签默认为"edge"的问题
我明白你遇到的困扰——用Gephi生成的GraphML加载到TinkerPop3(DSE 5.1.3配套的3.2.5版本)后,所有边的标签都变成了默认的"edge",但你明明在GraphML里用edgelabel字段指定了自定义标签。这是因为TinkerPop的GraphML Reader默认不会自动映射自定义数据字段作为边标签,得做一点配置调整就能解决。
问题根源
TinkerPop 3.2.x的GraphML IO组件默认遵循以下规则:
- 如果GraphML的
<edge>元素自带label属性,就直接用这个值作为边标签 - 如果没有
label属性,就会给所有边默认打上"edge"标签
你的GraphML是通过自定义的<data key="edgelabel">字段存储标签的,所以Reader不会自动识别这个字段作为边标签。
解决方案
有两种方式可以解决这个问题,你可以根据自身场景选择:
方案1:修改GraphML格式,给<edge>元素添加label属性
直接调整Gephi生成的GraphML,把edgelabel的值移到<edge>的label属性中,示例如下:
<edge id="1" source="1" target="3" label="belongs-to"> <data key="weight">1.0</data> </edge> <edge id="2" source="1" target="4" label="part-of"> <data key="weight">1.0</data> </edge>
这样用你原来的加载代码,就能直接得到正确的边标签了。不过如果没法修改GraphML的生成方式,推荐用方案2。
方案2:配置GraphMLReader,指定用edgelabel字段作为边标签
通过GraphMLReader.Builder的edgeLabelKey()方法,告诉Reader把edgelabel这个数据键的值当作边标签。修改你的加载代码如下:
Graph graphMLGraph = TinkerGraph.open(); // 构建自定义配置的GraphMLReader GraphMLReader reader = graphMLGraph.io(IoCore.graphml()).reader() .edgeLabelKey("edgelabel") // 指定使用edgelabel字段作为边标签 .create(); // 用配置好的Reader加载GraphML reader.readGraph(file.getAbsolutePath(), graphMLGraph); // 验证边标签 graphMLGraph.traversal().E().toStream().forEach(edge -> { System.out.println(edge.label()); // 现在会输出belongs-to、part-of });
这个方案不需要修改原始GraphML文件,更适合无法改动原文件的场景。
注意事项
要确保你的GraphML中<key>定义的id确实是edgelabel,也就是你配置的edgeLabelKey要和<key>的id完全一致,否则Reader找不到对应的数据。你的键定义是正确的:
<key attr.name="Edge Label" attr.type="string" for="edge" id="edgelabel"/>
内容的提问来源于stack exchange,提问作者Sathyakumar Seshachalam
相关产品推荐
相关产品推荐

