2017-01-23 10 views
0

Я пытаюсь сделать что-то похожее на this, но используя neo4j-driver вместо py2neo. Когда я запускаю следующий код, я получаю список всех узлов, возвращаемых запросом, однако график не создает никаких узлов.Создание iGraph из запроса cypher из neo4j-драйвера

from igraph import Graph 
from neo4j.v1 import GraphDatabase, basic_auth 

driver = GraphDatabase.driver("bolt://localhost:7687", auth=basic_auth("neo4j", "pass123")) 
session = driver.session() 

result = session.run("MATCH (a:author)-[r:PUBLISHED]->(p:paper) RETURN a,r,p") 

for record in result: 
    print(record) 

g = Graph.TupleList(result) 
print(g) 
session.close() 

консоли Результат:

<Record a=<Node id=946 labels=set([u'author']) properties={u'name': u'a9', u'id': u'9'}> r=<Relationship id=950 start=946 end=955 type=u'PUBLISHED' properties={}> p=<Node id=955 labels=set([u'paper']) properties={u'year': 2009, u'id': u'9', u'name': u'p9'}>> 
<Record a=<Node id=946 labels=set([u'author']) properties={u'name': u'a9', u'id': u'9'}> r=<Relationship id=949 start=946 end=953 type=u'PUBLISHED' properties={}> p=<Node id=953 labels=set([u'paper']) properties={u'year': 2007, u'id': u'7', u'name': u'p7'}>> 
IGRAPH UN-- 0 0 -- 
+ attr: name (v) 

Может кто-нибудь сказать мне, почему это не работает, пожалуйста?

ответ

2

Метод Py2neo cypher.execute возвращает объект, который по существу является списком dicts (или названных кортежей). Neo4j-драйвер этого не делает. Вместо этого вам потребуется выполнить итерацию через объект курсора, возвращаемый session.run, и построить список кортежей для перехода в конструктор igraph. Пример здесь используют данные из BuzzFeed Trumpworld graph, который только, случается, что я имею в Neo4j на данный момент, поэтому адаптировать запрос к вашим потребностям:

from igraph import Graph 
from neo4j.v1 import GraphDatabase, basic_auth 

driver = GraphDatabase.driver("bolt://localhost:7687", auth=basic_auth("neo4j", "pass123")) 
session = driver.session() 

result = session.run("MATCH (p1:Person)-[r]->(p2:Person) RETURN p1.name AS name1, p2.name AS name2") 
nodelist = [] 
for record in result: 
    nodelist.append((record["name1"], record["name2"])) 

nodelist представляет собой список кортежей, который выглядит следующим образом:

>>> print(nodelist) 

[('RUDY GIULIANI', 'WILBUR ROSS'), 
('GARY COHN', 'DONALD J. TRUMP'), 
('DAN COATS', 'DONALD J. TRUMP'), 
('MICHAEL POMPEO', 'DONALD J. TRUMP'), 
('OMAROSÉ ONEE MANIGAULT', 'DONALD J. TRUMP'), 
('MICK MULVANEY', 'DONALD J. TRUMP'), 
('ALEX SHNAIDER', 'DONALD J. TRUMP'), 
('MEHMET ALI YALCINDAG', 'DONALD J. TRUMP'), 
('MANGAL PRABHAT LODHA', 'DONALD J. TRUMP'), 
('ROGER KHAFIF', 'DONALD J. TRUMP')... 

Затем для создания экземпляра объекта igraph:

g = Graph.TupleList(nodelist) 

Мы можем работать PageRank на этом графике и увидеть, какой узел имеет самый высокий PageRank в качестве здравого смысла проверьте:

pg = g.pagerank() 
max_pg = max(pg) 
[g.vs[idx]["name"] for idx, pg in enumerate(pg) if pg == max_pg] 

И результат:

['DONALD J. TRUMP']