如何在 Gremlin 中查找图形模式?

How to find graph schema in Gremlin?

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

例如,如果节点有 3 个非保留属性,例如 NAME、education、gender。我想要一个像

这样的方法
g.V().schema().toList();
// result: [ID, LABEL, NAME, GENDER, EDUCATION]

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())));
  }

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

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 之外)。

Gremlin 本身没有架构的概念。这是一个深思熟虑的设计选择,因为模式 APIs 的功能和行为与一个图形系统实现与下一个图形系统实现完全不同,因此在 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

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