Использование NetworkX и нового для библиотеки для запроса анализа социальной сети. В Query я имею в виду выбор/создание подграфов атрибутами обоих ребер узлов, где ребра создают путь, а узлы содержат атрибуты. Граф использует MultiDiGraph формы
G2 = nx.MultiDiGraph()
G2.add_node( "UserA", { "type" :"Cat" } )
G2.add_node( "UserB", { "type" :"Dog" } )
G2.add_node( "UserC", { "type" :"Mouse" } )
G2.add_node( "Likes", { "type" :"Feeling" } )
G2.add_node( "Hates", { "type" :"Feeling" } )
G2.add_edge( "UserA", 'Hates' , statementid="1" )
G2.add_edge( "Hates", 'UserB' , statementid="1" )
G2.add_edge( "UserC", 'Hates' , statementid="2" )
G2.add_edge( "Hates", 'UserA' , statementid="2" )
G2.add_edge( "UserB", 'Hates' , statementid="3" )
G2.add_edge( "Hates", 'UserA' , statementid="3" )
G2.add_edge( "UserC", 'Likes' , statementid="3" )
G2.add_edge( "Likes", 'UserB' , statementid="3" )
Запрос
for node,data in G2.nodes_iter(data=True):
if ( data['type'] == "Cat" ):
# get all edges out from these nodes
#then recursively follow using a filter for a specific statement_id
#or get all edges with a specific statement id
# look for with a node attribute of "cat"
Есть ли лучший способ запроса? Или лучше всего создавать пользовательские итерации для создания подграфов?
В качестве альтернативы (и отдельного вопроса) график можно упростить, но я не использую приведенный ниже график, потому что объекты типа "ненависть" будут иметь прецессоры. Это упростит запрос? Кажется, что проще перебирать узлы
G3 = nx.MultiDiGraph()
G3.add_node( "UserA", { "type" :"Cat" } )
G3.add_node( "UserB", { "type" :"Dog" } )
G3.add_edge( "UserA", 'UserB' , statementid="1" , label="hates")
G3.add_edge( "UserA", 'UserB' , statementid="2" , label="hates")
Другие примечания:
- Возможно,
add_path
добавляет идентификатор созданного пути? - iGraph имеет
a отличная функция запроса
g.vs.select()