2017-01-23 74 views
0

我正在尝试类似于this,但使用neo4j-driver而不是py2neo。当我运行下面的代码时,我得到了查询返回的所有节点的列表,但是我的图形没有创建任何节点。从neo4j驱动程序密码查询中创建一个iGraph

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方法返回一个实质上是一个列表(或命名的元组)的对象。 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']