龙空技术网

图数据库-Neo4j

IT老周 165

前言:

此时大家对“centos7neo4j”大概比较重视,各位老铁们都想要剖析一些“centos7neo4j”的相关文章。那么小编也在网摘上网罗了一些有关“centos7neo4j””的相关文章,希望你们能喜欢,咱们一起来学习一下吧!

去年我们花了大量时间为一个电信客户开发了一个推荐系统,结果发现在短时间内完成推荐是一个非常困难的问题。

上周我们也遇到了类似的问题,我们需要在很短的时间来制定一个初步的策略。我很清楚数据驱动方法的缺陷,所以想测试另一种方法。

去年,有人提到了推荐系统的neo4jdb,但我没怎么注意。第一次听说Neo4j是在2016年,当时我只是简单了解了一下。

快到2020年了,我决定深入研究图形数据库,考虑以下因素:

是否能运行一个小的业务问题,而不需要看很多复杂教程;我能在短时间内得到大量有意义的信息吗?在我的中等配置的机器上有多大的可伸缩性?与python方法相比,它有多灵活?例如数据处理、特征生成等。1.下载并安装

在这里可以找到安装程序。

2.设置图形数据库

你可以创建一个新的项目,你将不得不创建一个数据库。单击添加数据库:

提供你选择的用户名和密码,然后单击“开始”。运行后,单击“打开”。

3.数据准备和数据定位

首先把你的数据放在哪里?如果你使用的是macOS,那么:

/Users/<your user folder>/Library/Application Support/com.Neo4j.Relate/Data/dbmss/<folder related to the DB you created above>/import/

将.csv文件放入导入文件夹:

<folder related to the DB you created above>

如果这是你的第一个项目,那么你在/dbms下只有一个文件夹,因此请将你的.csv文件放在/import中,不要太在意,也不要太冒昧。

(仅适用于mac用户:在Windows或Linux上更容易找到上述文件夹,因为在mac OS中,/users/<your user folder>/Library是隐藏的,因此你可以在spotlight search中键入/users/<your user folder>/Library并进入文件夹)

我对数据进行了大量的清理,只取了其中的1%用于实验。

你可以从GitHub获取所有的.csv文件:

Service_Providers.csv包括电信服务提供商,专门从事电信产品之一,如光纤、DTH、4G LTE等。Uses.csv将上述文件中的服务提供商映射到不同地理位置的主要电信公司(称为本地合作伙伴)。Similar.csv拥有主要电信运营商彼此相似的数据。4.根据上述数据制定问题陈述

在Neo4j、上述数据源的帮助下,我们的问题是能否向B2B环境下的主要电信公司推荐服务提供商和产品?

5.我们开始实践

在步骤2中,你打开了Neo4j浏览器。看起来像这样:

我们在neo4j$prompt旁边输入命令。

就像SQL一样,neo4j有自己的语言CQL,称为Cypher查询语言。

有了这三个CSV文件,我运行了以下命令来创建节点和关系。

LOAD CSV WITH HEADERS FROM "; AS rowMERGE (pName:provider_name {name: row.Provider})MERGE (pGeog:provider_loc {name: row.Geography})MERGE (pServs:provider_serv {name: row.Services})MERGE (pName)-[:Located_In]->(pGeog)MERGE (pName)-[:provides]->(pServs)LOAD CSV WITH HEADERS FROM "; AS rowMERGE (clientN:client_Name {name: row.Local_Partner})MERGE (pName:provider_name {name: row.Provider})MERGE (clientN)-[:Uses]->(pName)LOAD CSV WITH HEADERS FROM "; AS rowMERGE (clientN:client_Name {name: row.Local_Partner})MERGE (userN:client_Name {name: row.User})MERGE (clientN)-[:Is_Similar]->(userN)

数据库的侧边栏将包含创建的所有节点以及节点之间存在的所有关系的信息。

在CQL中,查询这些节点并将这些关系用作过滤器。

在neo4j提示符下运行以下命令:

Match(n) Return(n)

这太好了!

视觉表现告诉我谁和谁有联系,有什么潜在的关系。这样的视觉效果对于讲故事和商业观众来说是非常好的。

我怀疑当节点数很高时,这个图看起来会非常混乱。

6.建议

这个图包含了数据的所有信息,我们将使用CQL来挖掘这些关系,可以找到相似的实体,它们有什么共同点,它们使用什么产品等等。

让我们以“波士顿本地人”为例,它是主要的电信运营商之一(被称为本地合作伙伴)。

#其他类似“波士顿本地人”的合伙人。

MATCH (boston:client_Name{name:"Boston Locals"})-[:Is_Similar]-(client_Name)RETURN client_Name.name

结果如上图。

#找到产品和当地供应商使用相似的主要参与者。

MATCH (boston:client_Name {name:"Boston Locals"}),      (boston)-[:Is_Similar]-(partner),      (provider:provider_name)-[:Located_In]->(provider_loc),      (provider)-[:provides]->(provider_serv),      (partner)-[:Uses]->(provider)RETURN provider.name, provider_loc.name, collect(partner.name), provider_serv.name, count(*) as countORDER BY count DESC

在上面的查询中,collect函数将创建一个合作伙伴列表。

以上在Neo4j中的工作就是推荐系统空间中所谓的协同过滤。用户可以找到项目、用户、用户项目之间的相似性,并使用空间推荐项目、产品或服务。

这中间没有复杂的嵌入,神经网络,矩阵分解,但如果问题不是深奥的,那么为什么不去寻找一个更简单的解决方案!

7.Python方法

事实证明,neo4j可以通过驱动程序与python交互。

pip install neo4j

完成后,你可以轻松地在python文件中调用neo4j的功能(确保DB正在运行,否则会出现ServiceException错误)。

from neo4j import GraphDatabaseuri = "neo4j://localhost:7687"user = "neo4j"password = "hello@123"driver = GraphDatabase.driver(uri, auth=(user, password))session = driver.session()

然后你可以定义一个使用上述会话运行查询的函数。

我的Github上有这个文件:

def recommendations(service = '', location = '', client = ''):    client_list = []    if client == '':        client_list = []    else:        client_list = client.split(',')    service_name = service    location_name = location    services = "(service)" if service_name == '' else "(service:provider_serv {name: $service_name})"    locations = "(location)" if location_name == '' else "(location:provider_loc {name: $location_name})"    clients = "" if len(client_list) == 0 else "WHERE client.name IN %s" % (str(client_list))        neo4j_query = (            '''MATCH (provider:provider_name)-[:Located_In]->%s,                  (provider)-[:provides]->%s,                  (client:client_Name)-[:Uses]->(provider)            %s RETURN provider.name AS name, collect(client.name) AS who_takes_services, COUNT(*) AS counts            ORDER BY counts DESC''' % (locations, services, clients))       result = session.run(neo4j_query, service_name=service_name, location_name=location_name, client_list=client_list)        return [{"provider": row["name"], "who_takes_services": row["who_takes_services"], "counts": row["counts"]} for row in result]

你可以通过一个简单的打印语句来查看这些建议。

结论

经过最初的测试和一个疲惫的夜晚,我对Neo4j的结果和功能感到惊喜。

对于我想要找到答案的问题:

1. 我能在短时间内得到大量有意义的信息吗?

一定地!视觉信息有利于理解数据中更深层的关系。它也有助于白话文,易于解释和理解的数据。

2.在我的中等配置的机器上有多大的可伸缩性?

我的机器上运行它,内存16G,硬盘512G,i7 6核;我试着运行一个包含200K行和5列(全部是数字数据)的文件,我得到了Java堆空间错误,我减小了文件大小,但一直到70K行。但是这个大小我可以很容易地使用pandas dataframe或turicreate的Sframe做到。所以,目前我对可伸缩性持怀疑态度。

3.与python方法相比,它有多灵活?例如数据处理、特征生成等。

这里我使用了一个经典的用例,它可以通过基本的操作来解决,但是在一个日益复杂的工业环境中,仅仅是相似性并不能产生好的结果。我们需要构建特征空间,比如Neo4j中可能存在的嵌入,但我还没有探讨过这一点。Neo4j图形数据科学显示了前景。

现在,我想在探索性数据分析阶段将Neo4j纳入我的数据科学生命周期,以形成我可以使用python方法进行假设和测试。

在CQL的帮助下,我可以找到所有表现出某些特征的记录,并且可以测试从经典方法得到的结果查看是否具有一致性。

标签: #centos7neo4j