【发布时间】:2014-12-19 17:15:35
【问题描述】:
我有一个这样的递归数据结构:
@Canonical
static class Person {
String name
Set<Person> knows
}
我有一个 Tinkerpop 图来表示这个结构:
(Jon) -- knows --> (Billy) -- knows --> (Jane) -- ... -->
\- knows --> (Suzy) -- ... -->
将任意深度的 Tinkerpop 图映射到数据结构的最有效方法是什么?
我可以想象PathStep 的用法,但似乎应该有更好的方法,而且我对 TP3 的理解还不够好,无法看到它。
def 'build recursive person object'() {
when:
def g = TinkerGraph.open()
def jon = g.addVertex(T.label, 'person', 'name', 'jon')
def bill = g.addVertex(T.label, 'person', 'name', 'bill')
def jane = g.addVertex(T.label, 'person', 'name', 'jane')
jon.addEdge('knows', bill)
bill.addEdge('knows', jane)
Multimap<String, Person> relationships = HashMultimap.create()
g.V().has('name', 'jon')
.as('a')
.jump('b', { traverser -> !traverser.get().out('knows').hasNext() })
.outE('knows')
.inV()
.jump('a')
.as('b')
.path(
Function.<Vertex>identity(),
{ Edge e ->
relationships.put(e.outV().next().value('name') as String,
new Person(e.inV().next().value('name') as String))
} as Function
)
.next()
Person root = new Person('jon')
Stack<Person> people = new Stack<>()
Set<String> alreadySeen = new HashSet<>()
people.push(root)
alreadySeen.add('jon')
while(!people.isEmpty()) {
def person = people.pop()
person.knows = relationships.get(person.name)
for(Person related : person.knows) {
if(alreadySeen.add(related.name))
people.push(related)
}
}
then:
root.name == 'jon'
root.knows*.name == ['bill']
root.knows[0].knows*.name == ['jane']
}
【问题讨论】:
标签: titan gremlin tinkerpop3