Как построить подграф из транзитивных ребер?

У меня есть граф с материализованными отношениями, который содержит полезную информацию, но для визуализации мне нужно создать подграф без этих промежуточных узлов.

Пример :

[A:Person] <--AFFILIATE-- [B:Affiliation] --COMPANY--> [C:Org]

И я хочу создать такой подграф:

[A:Person] --AFFILIATED_TO--> [C:Org]

Есть ли простой способ получить это с Гремлином?


person Nicolas Delaforge    schedule 26.10.2017    source источник


Ответы (1)


Я думаю, что лучшим вариантом может быть использование шага subgraph() как вы обычно могли бы извлечь подграф, вызванный краем, а затем выполнить какой-нибудь Gremlin на этом подграфе, чтобы ввести края визуализации и удалить то, что вам не нужно.

Я могу продемонстрировать это на современном игрушечном графе, упакованном с помощью TinkerPop:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> sg = g.V().outE('created').subgraph('sg').cap('sg').next() // subgraph creation
==>tinkergraph[vertices:5 edges:4]
gremlin> g = sg.traversal()
==>graphtraversalsource[tinkergraph[vertices:5 edges:4], standard]
gremlin> g.V().as('a').                                     // add special subgraph edge
......1>   out('created').as('software').
......2>   in('created').where(neq('a')).
......3>   addE('co-developer').from('a').
......4>     property('project',select('software').by('name')) 
==>e[0][1-co-developer->4]
==>e[1][1-co-developer->6]
==>e[2][4-co-developer->1]
==>e[3][4-co-developer->6]
==>e[4][6-co-developer->1]
==>e[5][6-co-developer->4]
gremlin> g.V().hasLabel('software').drop() //remove junk from subgraph
gremlin> g.E()
==>e[0][1-co-developer->4]
==>e[1][1-co-developer->6]
==>e[2][4-co-developer->1]
==>e[3][4-co-developer->6]
==>e[4][6-co-developer->1]
==>e[5][6-co-developer->4]
gremlin> g.V().has('name','marko').outE('co-developer').valueMap(true)
==>[label:co-developer,project:lop,id:0]
==>[label:co-developer,project:lop,id:1]
person stephen mallette    schedule 26.10.2017
comment
Спасибо за ответ. Я попробую. Это немного менее прямолинейно, как я ожидал, но это, безусловно, сработает. - person Nicolas Delaforge; 26.10.2017
comment
Я не могу придумать лучшего способа с тем, как все работает в настоящее время, но было бы здорово, если бы существовал более простой способ. Я думаю, что это распространенный вариант использования. Я подумаю над этим еще. - person stephen mallette; 26.10.2017
comment
Было бы здорово объявить псевдонимы для шаблонов ребер и иметь возможность отображать на них подграф. - person Nicolas Delaforge; 26.10.2017
comment
Возможно, это связано с issues.apache.org/jira/browse/TINKERPOP-881 - person stephen mallette; 26.10.2017
comment
Да, эта функция позволила бы реализовать логические выводы, подобные правилам, так же, как это делают логики OWL. Это может быть очень полезно. - person Nicolas Delaforge; 26.10.2017