将子图(副作用)导出到 json 文件并在图中重新导入

Posted

技术标签:

【中文标题】将子图(副作用)导出到 json 文件并在图中重新导入【英文标题】:Exporting subgraph (sideeffect) to json file and importing back in graph 【发布时间】:2017-07-10 22:12:35 【问题描述】:

我想将子图导出到 json 文件并导入到其他图中。我尝试如下:

gremlin> subGraph = g.V().has("name","john").outE("has").subgraph("subgraph").cap("subgraph").next()
==>tinkergraph[vertices:6 edges:5]

现在我有子图对象然后我使用graphson将此子图对象直接写入json文件,如下所示:

subGraph.io(GraphSONIo.build()).writeGraph("/tmp/subgraph.json")

但我收到这样的错误:

(was java.lang.IllegalStateException) (through reference chain: com.thinkaurelius.titan.graphdb.relations.RelationIdentifier["inVertexId"])

什么问题??

【问题讨论】:

【参考方案1】:

我认为问题在于您有一个 TinkerGraph 作为您的子图,但该子图包含一个 Titan 标识符,GraphSON 不知道如何本地处理。您需要向 GraphSON 提供 Titan 序列化程序,以便它知道如何处理 RelationIdentifier。您没有说您使用的是什么版本的 Titan,但我认为无论版本如何,这种方法都有效:

mapper = GraphSONMapper.build().
                        addCustomModule(TitanGraphSONModule.getInstance()).
                        create()
writer = GraphSONWriter.build().mapper(mapper).create()
os = new FileOutputStream("/tmp/subgraph.json")
writer.writeGraph(os, subgraph)

更现代的 JanusGraph 方法是:

sg.io('/tmp/sample.json').
     by(IO.registry, org.janusgraph.graphdb.tinkerpop.io.graphson.JanusGraphSONModuleV2d0.getInstance()).
   write().iterate()

【讨论】:

我正在使用 Titan 1.0,并且图形对象是使用 graph = TitanFactory.open("../conf/titan-cassandra.properties") 的泰坦图形,当使用上述 gremlin 查询创建子图时,它会给出 TinkerGraph 对象?那么我们可以将子图创建为泰坦图对象吗? 我在 gremlin 上尝试了您的代码,它为映射器对象提供错误 No such property: TitanGraphSONModule for class: groovysh_evaluate 是的,即使您的主图是 Titan,子图也是内存中的 TinkerGraph。通常,这很有意义,因为您通常不希望保留子图。我不记得你是否可以在 1.0 中子图化到 Titan - 我认为这是在很久以后作为 TinkerPop 的功能添加的。至于您的错误,我认为您可能需要将该类导入控制台 - 您可以在此处找到包名称:github.com/thinkaurelius/titan/blob/1.0.0/titan-core/src/main/…

以上是关于将子图(副作用)导出到 json 文件并在图中重新导入的主要内容,如果未能解决你的问题,请参考以下文章

最大半连通子图 bzoj 1093

bzoj 1093: [ZJOI2007]最大半连通子图

将子图与颜色条对齐

如何将子图层居中在另一图层上?

什么时候可以将子图视为网络的一个巨大组成部分?

子图中的分页符?多个页面上的 Matplotlib 子图