Neo4j Twitter 恶意用户教程#
目标: 本笔记本旨在展示如何使用PyGraphistry来可视化来自Neo4j的数据。我们还展示了如何使用Neo4j中的图算法,并使用PyGraphistry来可视化这些算法的结果。
前提条件: * 你需要一个Graphistry API密钥,你可以在这里申请 here * Neo4j。我们将使用 Neo4j Sandbox(免费托管的Neo4j实例,预先填充了数据)来完成本教程。具体来说,是“俄罗斯推特巨魔”沙盒。你可以在这里创建一个Neo4j Sandbox实例 here * Python要求: * `neo4j-driver
<neo4j/neo4j-python-driver>`__ - pip install neo4j-driver
* `pygraphistry
<graphistry/pygraphistry>`__ - pip install "graphistry[all]"
大纲#
连接到Neo4j
使用neo4j-driver Python客户端
使用Cypher进行查询
从Neo4j可视化Graphistry中的数据
来自Twitter数据的用户提及
图算法
使用PageRank增强我们的可视化
[1]:
# import required dependencies
from neo4j.v1 import GraphDatabase, basic_auth
from pandas import DataFrame
import graphistry
[2]:
# To specify Graphistry account & server, use:
# graphistry.register(api=3, username='...', password='...', protocol='https', server='hub.graphistry.com')
# For more options, see https://github.com/graphistry/pygraphistry#configure
连接到Neo4j#
如果还没有,请在Neo4j Sandbox上创建一个俄罗斯Twitter Trolls沙盒实例。我们将使用Neo4j的Python驱动从Neo4j获取数据。为此,我们需要实例化一个Driver
对象,并传入我们的Neo4j实例的凭据。如果使用Neo4j Sandbox,您可以在“详细信息”选项卡中找到您的Neo4j实例的凭据。具体来说,我们需要IP地址、bolt端口、用户名和密码。Bolt是Neo4j驱动程序使用的二进制协议,因此典型的数据库URL字符串形式为bolt://
[3]:
# instantiate Neo4j driver instance
# be sure to replace the connection string and password with your own
driver = GraphDatabase.driver("bolt://34.201.165.36:34532", auth=basic_auth("neo4j", "capitals-quality-loads"))
一旦我们实例化了我们的Driver,我们就可以使用Session
对象来对Neo4j执行查询。这里我们将使用session.run()
来执行一个Cypher查询。Cypher是我们与Neo4j一起使用的图查询语言(你可以将Cypher视为图的SQL)。
[4]:
# neo4j-driver hello world
# execute a simple query to count the number of nodes in the database and print the result
with driver.session() as session:
results = session.run("MATCH (a) RETURN COUNT(a) AS num")
for record in results:
print(record)
<Record num=281217>
如果我们检查Neo4j中的数据模型,我们可以看到我们有关于推文的信息,特别是推文中提到的用户。
让我们使用Graphistry来可视化用户-用户之间的推文提及互动。我们将通过查询Neo4j来获取所有提及用户的推文。
使用Graphistry与Neo4j#
目前,PyGraphistry 可以与 pandas DataFrame、NetworkX 图或 IGraph 图对象一起工作。在本节中,我们将展示如何通过将 Python Neo4j 驱动程序的结果转换为 pandas DataFrame,将数据从 Neo4j 加载到 PyGraphistry 中。
我们的目标是可视化用户-用户推文提及互动。我们将创建两个pandas数据框,一个代表我们的节点(用户),另一个代表我们图中的关系(提及)。
一些用户是已知的Troll账户,因此我们包含了一个标志变量troll
,用于指示用户是否为Troll。这将在我们的可视化中用于设置已知Troll账户的颜色。
[7]:
# Create User DataFrame by querying Neo4j, converting the results into a pandas DataFrame
with driver.session() as session:
results = session.run("""
MATCH (u:User)
WITH u.user_key AS screen_name, CASE WHEN "Troll" IN labels(u) THEN 5 ELSE 0 END AS troll
RETURN screen_name, troll""")
users = DataFrame(results.data())
# show the first 5 rows of the DataFrame
users[:5]
[7]:
screen_name | troll | |
---|---|---|
0 | robbydelaware | 5 |
1 | scottgohard | 5 |
2 | beckster319 | 5 |
3 | skatewake1994 | 5 |
4 | kadirovrussia | 5 |
接下来,我们需要一些关系来进行可视化。在这种情况下,我们对可视化用户互动感兴趣,特别是用户在推文中提到其他用户的情况。
[8]:
# Query for tweets mentioning a user and create a DataFrame adjacency list using screen_name
# where u1 posted a tweet(s) that mentions u2
# num is the number of time u1 mentioned u2 in the dataset
with driver.session() as session:
results = session.run("""
MATCH (u1:User)-[:POSTED]->(:Tweet)-[:MENTIONS]->(u2:User)
RETURN u1.user_key AS u1, u2.user_key AS u2, COUNT(*) AS num
""")
mentions = DataFrame(results.data())
mentions[:5]
[8]:
num | u1 | u2 | |
---|---|---|---|
0 | 1 | dorothiebell | dwstweets |
1 | 1 | happkendrahappy | nineworthies |
2 | 2 | aiden7757 | theclobra |
3 | 1 | ameliebaldwin | dcclothesline |
4 | 9 | ameliebaldwin | jturnershow |
现在我们可以使用Graphistry来可视化这个提及网络。我们将为我们的图指定节点和关系。我们还将使用troll
属性将已知的Troll节点着色为红色,使它们在图中与其他用户区分开来。
[9]:
viz = graphistry.bind(source="u1", destination="u2", node="screen_name", point_color="troll").nodes(users).edges(mentions)
viz.plot()
[9]:
运行上述Python单元格后,您应该会看到一个交互式的Graphistry可视化,如下所示:
已知的恶意用户节点用红色标记,普通用户用蓝色标记。默认情况下,节点的大小与节点的度数(关系数量)成正比。我们将在下一节中看到如何使用诸如PageRank之类的图算法,并在Graphistry中可视化这些算法的结果。
图算法#
上述可视化展示了数据中的用户-用户推文提及互动。如果我们想回答“谁是这个网络中最重要用户?”的问题,一种方法是查看每个节点的度数或关系数量。默认情况下,PyGraphistry使用度数来设置节点的大小样式,使我们能够一目了然地确定节点的重要性。
我们还可以使用图算法,如PageRank,来确定网络中的重要性。在本节中,我们将展示如何在Neo4j中运行图算法,并在我们的Graphistry可视化中使用这些算法的结果。
[10]:
# run PageRank on the projected mentions graph and update nodes by adding a pagerank property score
with driver.session() as session:
session.run("""
CALL algo.pageRank("MATCH (t:User) RETURN id(t) AS id",
"MATCH (u1:User)-[:POSTED]->(:Tweet)-[:MENTIONS]->(u2:User)
RETURN id(u1) as source, id(u2) as target", {graph:'cypher', write: true})
""")
现在我们已经为每个用户节点计算了PageRank,我们需要通过查询Neo4j为我们的用户节点创建一个新的pandas DataFrame:
[11]:
# create a new users DataFrame, now including PageRank score for each user
with driver.session() as session:
results = session.run("""
MATCH (u:User)
WITH u.user_key AS screen_name, u.pagerank AS pagerank, CASE WHEN "Troll" IN labels(u) THEN 5 ELSE 0 END AS troll
RETURN screen_name, pagerank, troll""")
users = DataFrame(results.data())
users[:5]
[11]:
pagerank | screen_name | troll | |
---|---|---|---|
0 | 0.150000 | robbydelaware | 5 |
1 | 0.151547 | scottgohard | 5 |
2 | 0.150000 | beckster319 | 5 |
3 | 0.150000 | skatewake1994 | 5 |
4 | 0.150000 | kadirovrussia | 5 |
[12]:
# render the Graphistry visualization, binding node size to PageRank score
viz = graphistry.bind(source="u1", destination="u2", node="screen_name", point_size="pagerank", point_color="troll").nodes(users).edges(mentions)
viz.plot()
[12]:
现在当我们渲染Graphistry可视化时,节点大小与节点的PageRank分数成正比。这导致了一组不同的节点被识别为最重要的。
通过将节点大小与图算法的结果绑定,我们能够一目了然地从数据中获取洞察,并进一步探索交互式可视化。
[ ]: