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

问题描述 投票:2回答:3

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

例如,如果节点有3个非保留属性,例如NAME,education,gender。我想要一个类似的方法

g.V().schema().toList();
// result: [ID, LABEL, NAME, GENDER, EDUCATION]
java gremlin tinkerpop3
3个回答
5
投票

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

如果您使用允许架构定义的图形,如JanusGraph或DSE Graph,您应该只使用该图形系统的基础Schema 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的遍历。


1
投票

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

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"

但如果没有保证每个节点都有一组相同的属性,我找不到任何其他解决方案而不是检索Map List中的所有属性,并使用java集合方法(Gremlin外部)查找distinct属性。


0
投票

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())));
  }
© www.soinside.com 2019 - 2024. All rights reserved.