【问题标题】:Sub-classing Graph, Vertex and Edge in python graph-tool at the same time在 python graph-tool 中同时对 Graph、Vertex 和 Edge 进行子分类
【发布时间】:2017-09-04 17:15:56
【问题描述】:

是否可以同时对graph-tool 中的 Graph、Vertex 和 Edge 类进行子类化以实现某种类型的图的行为,例如社交网络?
更具体地说,我想要一个包含 class Person(Vertex)class Publication(Vertex)class Authored(Edge) 等实例的 class CollaborationNetwork(Graph)
我想 Person 和 Publication 顶点由 property_map 标识,而 Graph 方法被包装成 add_authorship(Person, Publication) 之类的东西,它创建了 Authored 的实例。

我不确定基于graph-tool 实现这样的抽象是否有意义,如果是,如何将CollaborationNetwork 连接到Vertex 和Edge 的子类。 (我知道只有Subclassing Graph from the graph_tool package 可以工作)。

关于动机:
我将模拟社交网络的增长,并将其与存储为 Neo4j 图的实际数据进行比较。 我喜欢 py2neo OGM 方法,它将这些 Person 和 Publication 数据表示为 python 对象。

【问题讨论】:

    标签: python graph-tool


    【解决方案1】:

    这是可能的,但我看不出这样做有什么真正的好处。

    子类化Vertex 很容易,但是有几个Edge 类,具体取决于图形是定向的还是过滤的。为了使其工作,您必须将Graph 方法包装在返回VertexEdge 对象(或其迭代器)的派生类中,以便它们将它们转换为派生的Edge 和@987654328 @对象。

    这样做只是为了让类具有不同的名称,在我看来是浪费精力。但这也不是不可能的。

    一个更简单的策略是创建一个单独的类(比如CitationGraph),它不是Graph 的子类,而是包含一个实例。然后,您可以实现诸如add_personadd_publication 之类的便利函数来执行您的基本操作,同时允许您随时访问底层Graph。这样做可以避免很多麻烦,甚至基本上免费为您提供pickle 支持。

    【讨论】:

    • 谢谢,蒂亚戈。这完全回答了我的问题!我怀疑即使可能,“对象-图映射”方法也会是矫枉过正。关于您关于包含 Graph 实例的建议,我们已经有这样做的经验并且效果很好:scientometric-graph-tool
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多