在Jupyter笔记本中探索带有Memgraph的Twitter网络
#twitter #python #算法 #memgraph

通过本简短的教程,您将学习如何安装memgraph,连接到
它来自jupyter笔记本,并使用图形算法执行数据分析。你
可以在我们的开源GitHub
repository
中找到原始的Jupyter笔记本。

如果在任何时候您会遇到本教程问题或某些内容
您不清楚,在我们的Discord server上伸出手。
本教程的数据集也可以以Playground
sandbox
的形式获得 您可以从浏览器中查询。

1.先决条件

对于本教程,您需要安装:

  • Jupyter :jupyter是必要的 笔记本可在此处提供。
  • Docker :使用Docker是因为 memgraph是一个本机Linux应用程序,不能安装在Windows和 macos。
  • GQLAlchemy :python ogm(对象 与Memgraph连接的图形映射器。
  • Pandas :一种流行的数据科学 图书馆。

2.使用Docker安装

安装Docker后,您可以通过运行:
来设置MEMGRAPH

docker run -it -p 7687:7687 -p 3000:3000 memgraph/memgraph-platform

此命令将启动下载,完成后,运行MEMGRAPH
容器。

3.与GQLalchemy连接到MEMGRAPH

我们将使用 gqlalchemy 对象图映射器(OGM)连接到
memgraph并执行 cypher 查询很容易。 gqlalchemy也是A
python驱动程序/客户端。您可以使用:
安装它

pip install gqlalchemy

提示:您可能需要在
之前安装CMake 安装gqlalchemy。

也许当我提到Cypher时,您感到困惑。您可以将Cypher视为SQL
对于图形数据库。它包含许多相同的语言构造,例如
CREATEUPDATEDELETE ...用于查询数据库。

from gqlalchemy import Memgraph

memgraph = Memgraph("127.0.0.1", 7687)

让我们确保备忘录是空的,然后再开始使用其他任何东西。

memgraph.drop_database()

现在让我们看看数据库是否为空:

results = memgraph.execute_and_fetch(
    """
    MATCH (n) RETURN count(n) AS number_of_nodes ;
    """
)
print(next(results))

输出:

{'number_of_nodes': 0}

4.定义图模式

我们将创建代表我们的图形模式的Python类。这个
方式,从memgraph返回的所有对象都是正确的类型
如果可以找到类的定义。

from typing import Optional
from gqlalchemy import Field, Node, Relationship


class User(Node):
    username: str = Field(index=True, unique=True, db=memgraph)


class Retweeted(Relationship, type="RETWEETED"):
    pass

5.创建和返回节点

我们将创建User节点,将它们保存到数据库中并返回它们
对于我们的计划:

user1 = User(username="ivan_g_despot")
user2 = User(username="supe_katarina")

user1.save(memgraph)
user2.save(memgraph)

print(user1)
print(user2)

输出:

<User id=1874 labels={'User'} properties={'username': 'ivan_g_despot'}>
<User id=1875 labels={'User'} properties={'username': 'supe_katarina'}>

现在,让我们尝试使用Cypher查询语言创建一个节点。我们要去
创建一个具有现有用户名的节点只是为了检查是否存在
属性username的约束正确设置了。

try:
    results = memgraph.execute(
        """
        CREATE (:User {username: "supe_katarina"});
        """
    )
except Exception:
    print("Error: A user with the username supe_katarina is already in the database.")

输出:

Error: A user with the username supe_katarina is already in the database.

6.建立和返回关系

我们将创建一个Retweeted关系,将其保存到数据库中并
将其返回我们的程序:

retweeted = Retweeted(_start_node_id=user1._id, _end_node_id=user2._id)

retweeted.save(memgraph)

print(retweeted)

输出:

<Retweeted id=1670 start_node_id=1874 end_node_id=1875 nodes=(1874, 1875) type=RETWEETED properties={}>

7.从CSV文件导入数据

您将需要下载包含一个简单数据集的this file 刮去推文。要将其导入Memgraph,我们首先需要将其复制到
MEMGRAPH正在运行的Docker容器。通过运行:
找到CONTAINER_ID

docker ps

用以下命令复制文件(别忘了替换
CONTAINER_ID):

docker cp scraped_tweets.csv CONTAINER_ID:scraped_tweets.csv

我们将在Pandas的帮助下查看CSV文件的外观
图书馆。要安装它,请运行:

pip install pandas

现在让我们看看CSV文件的外观:

import pandas as pd

data = pd.read_csv("scraped_tweets.csv")
data.head()
.dataframe tbody tr th:only-of-type {
    vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

输出:

source_username target_username
0 capecodgiftshop retroceo
1 codeattbot Leehillerlondon
2 Battlegroundhs getwhalinvest
3 botpokemongofr1 trevorallenpkmn
4 Anyasha13331181 worldmusicaward

现在,我们可以执行用于加载的Cypher命令LOAD CSV
来自CSV文件的数据:

memgraph.execute(
    """
    LOAD CSV FROM "/scraped_tweets.csv" WITH HEADER AS row
    MERGE (u1:User {username: row.source_username})
    MERGE (u2:User {username: row.target_username})
    MERGE (u1)-[:RETWEETED]->(u2);
    """
)

您可以将LOAD CSV子句视为将遍及
的每一行的循环 CSV文件并执行指定的Cypher命令。

8.查询数据库并检索结果

让我们确保通过检索正确导入数据:

results = memgraph.execute_and_fetch(
    """
    MATCH (u:User)
    RETURN u
    ORDER BY u.username DESC
    LIMIT 10;
    """
)

results = list(results)

for result in results:
    print(result["u"])

输出:

<User id=3692 labels={'User'} properties={'username': 'zziru67'}>
<User id=3240 labels={'User'} properties={'username': 'zippydjh'}>
<User id=3725 labels={'User'} properties={'username': 'zee_row_ex'}>
<User id=3591 labels={'User'} properties={'username': 'yvonneqqm'}>
<User id=3212 labels={'User'} properties={'username': 'yujulia999'}>
<User id=2378 labels={'User'} properties={'username': 'yudhapati88'}>
<User id=2655 labels={'User'} properties={'username': 'yu100_kun'}>
<User id=2302 labels={'User'} properties={'username': 'youth_tree'}>
<User id=2432 labels={'User'} properties={'username': 'yourkpopsoul'}>
<User id=2132 labels={'User'} properties={'username': 'your_harrogate'}>

我们还可以检查检索记录的类型:

u = results[0]["u"]

print("User: ", u.username)
print("Type: ", type(u))

输出:

User:  zziru67
Type:  <class '__main__.User'>

让我们尝试使用gqlalchemy查询构建器执行相同的查询:

from gqlalchemy import match

results_from_qb = (
    match()
    .node(labels="User", variable="u")
    .return_()
    .order_by("u.username DESC")
    .limit(10)
    .execute()
)
results_from_qb = list(results_from_qb)

for result in results_from_qb:
    print(result["u"])

输出:

<User id=3692 labels={'User'} properties={'username': 'zziru67'}>
<User id=3240 labels={'User'} properties={'username': 'zippydjh'}>
<User id=3725 labels={'User'} properties={'username': 'zee_row_ex'}>
<User id=3591 labels={'User'} properties={'username': 'yvonneqqm'}>
<User id=3212 labels={'User'} properties={'username': 'yujulia999'}>
<User id=2378 labels={'User'} properties={'username': 'yudhapati88'}>
<User id=2655 labels={'User'} properties={'username': 'yu100_kun'}>
<User id=2302 labels={'User'} properties={'username': 'youth_tree'}>
<User id=2432 labels={'User'} properties={'username': 'yourkpopsoul'}>
<User id=2132 labels={'User'} properties={'username': 'your_harrogate'}>

9.计算Pagerank

现在,让我们用图表做一些聪明的事情。例如,计算Pagerank
对于每个节点,然后添加一个存储Pagerank值的rank属性
每个节点:

results = memgraph.execute_and_fetch(
    """
    CALL pagerank.get()
    YIELD node, rank
    SET node.rank = rank
    RETURN node, rank
    ORDER BY rank DESC
    LIMIT 10;
    """
)

for result in results:
    print("The PageRank of node ", result["node"].username, ": ", result["rank"])

输出:

The PageRank of node  WORLDMUSICAWARD :  0.13278838151391434
The PageRank of node  Kidzcoolit :  0.018924764871246207
The PageRank of node  HuobiGlobal :  0.011314994833838172
The PageRank of node  ChloeLe39602964 :  0.010011755296388128
The PageRank of node  getwhalinvest :  0.007228675936490175
The PageRank of node  Cooper_Lechat :  0.005577971882231625
The PageRank of node  Phemex_official :  0.005413803151353543
The PageRank of node  HamleysOfficial :  0.005325936307836382
The PageRank of node  bmstores :  0.00524546649693655
The PageRank of node  TheStourbridge :  0.004422198431576731

访问Memgraph MAGE图库(
给我们扔一个明星,看看
的所有图形算法 实施的。您还可以实施并提交自己的算法和实用程序
程序。

10.在Memgraph Lab中可视化图

在地址上的浏览器中打开MEMGRAPH LAB
localhost:3000。执行以下Cypher查询:

MATCH (n)-[r]-(m)
RETURN n, r, m
LIMIT 100;

现在应用以下图样式以使您的图形看起来更具描述性:

@NodeStyle {
  size: Sqrt(Mul(Div(Property(node, "rank"), 1), 200000))
  border-width: 1
  border-color: #000000
  shadow-color: #1D9BF0
  shadow-size: 10
  image-url: "https://i.imgur.com/UV7Nl0i.png"
}

@NodeStyle Greater(Size(Labels(node)), 0) {
  label: Format(":{}", Join(Labels(node), " :"))
}

@NodeStyle HasLabel(node, "User") {
  color: #1D9BF0
  color-hover: Darker(#dd2222)
  color-selected: #dd2222
}

@NodeStyle HasProperty(node, "username") {
  label: AsText(Property(node, "username"))
}

@EdgeStyle {
  width: 1
}

memgraph-tutorial-twitter-dynamic-pagerank-visualization

图像1.节点的半径与其pagerank值成正比

下一步是什么?

现在是时候让您在图形问题上使用memgraph!

您随时可以查看Memgraph Playground
对于一些很酷的用例和示例。如果您有任何疑问,或者想
与社区其他成员分享您的工作,加入我们的 Discord
Server

Read more about Python and graph databases on memgraph.com