原文链接: neo4j 社交查询
上一篇: neo4j 切换数据库
下一篇: neo4j 导入数据的优化
创建csv格式文件
人物数目,和朋友概率.
import random
from py2neo import Graph, Node, Relationship
def create_friend_csv(cnt, p):
with open("node.csv", mode='w+', encoding="utf8") as f:
s = "id,age"
for i in range(cnt):
s += "\n%d,%d" % (i, random.randint(1, 100))
f.write(s)
with open("friend.csv", mode='w+', encoding='utf8') as f:
# 表示a,b在y年相识,a->b 表示a认识b
s = "a,b,y"
for i in range(cnt):
# 创建朋友关系,朋友个数为1,到理论个数之间的任意值
for k in range(random.randint(1, int(cnt * p))):
j = random.randint(0, cnt)
# 自己不能喝自己是朋友...
while j == i:
j = random.randint(0, cnt)
s += "\n%d,%d,%d" % (i, j, random.randint(1900, 2020))
f.write(s)
create_friend_csv(100000, 0.0001)
导入数据到数据库
match (n)
detach delete n
using periodic commit 10000
load csv with headers from 'file:///node.csv'
as line create (:Person{id:line.id,age:toint(line.age)})
CREATE INDEX ON :Person(id)
using periodic commit 10000
load csv with headers from 'file:///friend.csv' as line
match (n:Person{id:line.a}),(m:Person{id:line.b})
create (n)-[:Friend{year:toInteger(line.y)}]->(m)
不加索引的话,花费时间比较长.....
Set 199577 properties, created 199577 relationships, completed after 5710524 ms.
查询
六度理论
两个人之间可以通过六个人相互认识,在十万个节点,万分之一的概率下,基本符合
match p=(n:Person{id:"0"})-[r*1..6]-(m)
return count( distinct m)
查询自己和自己是好朋友...在创建关系时,没有添加过滤条件....
match p=(n:Person)-[]-(m:Person)
where n.id=m.id
return p
match p=shortestPath((n:Person{id:"0"})-[r*]-(m:Person{id:"100"}))
return p