我想在图中找到所有节点和边缘属性。如何列出图中存在的节点(或边)属性?
例如,如果节点有3个非保留属性,例如NAME,education,gender。我想要像
这样的方法g.V().schema().toList();
// result: [ID, LABEL, NAME, GENDER, EDUCATION]
答案 0 :(得分: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 :(得分: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之外)
答案 2 :(得分:0)
JUnit测试用例中的最后两行可能更接近你想做的事情。 另见:
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())));
}