【问题标题】:How to find graph schema in Gremlin?如何在 Gremlin 中找到图形模式?
【发布时间】:2018-01-28 15:45:34
【问题描述】:

我想在图中找到所有节点和边的属性。如何列出图中存在的节点(或边)属性?

例如,如果节点具有 3 个非保留属性,例如姓名、教育、性别。我想要一个类似的方法

g.V().schema().toList();
// result: [ID, LABEL, NAME, GENDER, EDUCATION]

【问题讨论】:

  • 我在 google 和 stackoverflow 中使用许多关键字搜索我的问题,并尝试通过 IDE 自动完成在 gremlin 中找到一种方法。我还能做更多的努力吗?我应该强调我努力寻找答案?
  • 可能没有“模式”之类的东西——每个节点可能有不同的属性和边。否则,只需在下面修改我的答案以打印出键而不是值 - 如果您的图表在架构有意义的意义上是统一的,您也只需访问一个节点(每个 nodeType)以获取信息。您对哪种“模式”感兴趣 - 请更清楚地说明您的期望。
  • 我不明白你的问题。我想找出特定节点中的哪些信息。一世。 e.探索性数据分析。
  • 我假设您对属性的名称和类型以及边的名称和“类型”感兴趣。我相应地修改了我的答案。我试图通过查看en.wikipedia.org/wiki/Exploratory_data_analysis 的“探索性数据分析”来理解您的提示,它似乎只与图形问题远程相关。因此,请通过示例更详细地说明您的需求。

标签: java gremlin tinkerpop3


【解决方案1】:

Gremlin 本身没有模式的概念。这是一个深思熟虑的设计选择,因为架构 API 的功能和行为与一个图形系统实现完全不同,并且在 Apache TinkerPop 中形成适当的抽象是非常困难的。通过这种方式,它非常类似于 TinkerPop 2.x 尝试构建通用索引 API,但最终过于通用而对任何人都没有用,并且添加了更多复杂性,这超出了大多数情况的要求。最后,与索引 API 一样,TinkerPop 3.x 忽略了泛化模式的想法。

如果您使用像 JanusGraph 或 DSE Graph 这样允许架构定义的图,您应该简单地使用该图系统的底层架构 API 来获取您的所有架构值。如果您没有使用那种类型的图表,那么您将需要按照迄今为止其他答案中提供的内容做一些事情,并遍历所有顶点(或边)并获取唯一的属性键。这是我的版本:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().properties().key().dedup()
==>name
==>age
==>lang

这里的问题是,要进行这种类型的遍历,您将需要全图扫描,如果您的图很大,这将是一个问题。在这些情况下,您将需要使用 Spark 等基于 OLAP 的遍历。

【讨论】:

【解决方案2】:

如果所有节点都具有相同的属性。我们可以找到第一个顶点的属性并将其推广到所有节点:

TinkerGraph tg = TinkerGraph.open() ;
tg.io(IoCore.graphml()).readGraph("src\\main\\resources\\air-routes.graphml");
GraphTraversalSource g = tg.traversal();

g.V().propertyMap().select(Column.keys).next();
// result = {LinkedHashSet@1831}  size = 12
// 0 = "country"
// 1 = "code"
// 2 = "longest"
// 3 = "city"
// 4 = "elev"
// 5 = "icao"
// 6 = "lon"
// 7 = "type"
// 8 = "region"
// 9 = "runways"
// 10 = "lat"
// 11 = "desc"

但是如果不保证每个节点具有相同的一组属性,我找不到任何其他解决方案,而不是检索地图列表中的所有属性并使用 java 集合方法(Gremlin 之外)找到不同的属性。

【讨论】:

    【解决方案3】:

    JUnit 测试用例中的最后两行可能更接近于您想要的。 另见:

    https://github.com/BITPlan/com.bitplan.simplegraph/blob/master/simplegraph-core/src/test/java/com/bitplan/simplegraph/core/TestTinkerPop3.java

    graph.traversal().V().next().properties()
        .forEachRemaining(prop -> System.out.println(String.format("%s=%s",
            prop.label(), prop.value().getClass().getSimpleName())));
    graph.traversal().V().next().edges(Direction.OUT)
        .forEachRemaining(edge -> System.out.println(
            String.format("%s->%s", edge.label(), edge.outVertex().label())));
    

    制作:

    name=String
    age=Integer
    created->person
    knows->person
    

    JUnit 测试用例

      @Test
      public void testSchema() {
        Graph graph = TinkerFactory.createModern();
        graph.traversal().V().next().properties()
            .forEachRemaining(prop -> System.out.println(String.format("%s=%s",
                prop.label(), prop.value().getClass().getSimpleName())));
        graph.traversal().V().next().edges(Direction.OUT)
            .forEachRemaining(edge -> System.out.println(
                String.format("%s->%s", edge.label(), edge.outVertex().label())));
      }
    

    【讨论】:

    • 我想要节点架构而不是值。您知道您的节点具有“名称”属性,但我没有。似乎 gremlin 没有直接获取模式的方法。我是真的吗?
    • 我改变了答案。它此时具有重复的边缘信息,但应该接近您的需求。
    猜你喜欢
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多