Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Gremlin中找到图模式?_Java_Gremlin_Tinkerpop3 - Fatal编程技术网

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

Java 如何在Gremlin中找到图模式?,java,gremlin,tinkerpop3,Java,Gremlin,Tinkerpop3,我想找到图中所有的节点和边属性。如何列出图形中存在的节点(或边)属性 例如,如果节点有3个非保留属性,例如名称、学历、性别。我想要一个像这样的方法 g.V().schema().toList(); // result: [ID, LABEL, NAME, GENDER, EDUCATION] JUnit测试用例中的最后两行可能更接近于实现您想要的功能。 另见: 制作: name=String age=Integer created->person knows->person J

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

例如,如果节点有3个非保留属性,例如名称、学历、性别。我想要一个像这样的方法

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

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

制作:

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本身没有模式的概念。这是一个经过深思熟虑的设计选择,因为模式API的功能和行为在不同的图形系统实现中是完全不同的,在Apache TinkerPop中形成适当的抽象非常困难。通过这种方式,它非常类似于TinkerPop 2.x构建通用索引API的尝试,它最终过于通用,对任何人都没有用处,并且增加了更多的复杂性,超过了大多数情况所需的复杂性。最后,与索引API一样,Tinkerpop3.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或类似工具。

我在google和stackoverflow中使用许多关键字搜索我的问题,并尝试通过IDE autocomplete在gremlin中找到一个方法。我还能做些什么?我应该强调的是,我努力寻找我的答案?可能没有“模式”这样的东西-每个节点可能有不同的属性和边。否则,只需修改我下面的答案,打印出键而不是值——如果您的图在模式意义上是一致的,那么您也只需访问一个节点(每个节点类型)即可获得信息。你对什么样的“模式”感兴趣?请更清楚地说明你的期望。我不理解你的问题。我想找出特定节点中的信息。我E探索性数据分析。我假设您对属性的名称和类型以及边的名称和“类型”感兴趣。我相应地修改了我的答案。我试图通过“探索性数据分析”来理解你的暗示,它似乎与图表问题有着千丝万缕的联系。所以,请用一个例子来详细解释你的需求,我想要的是节点模式,而不是值。你知道你的节点有一个“name”属性,但我没有。gremlin似乎没有一种直接获取模式的方法。我是真的吗?我改变了答案。此时它有重复的边缘信息,但应该接近您的需要。
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