要了解使用Neo4J进行朋友关系的优势,我在MySQL数据库上创建了一个人员表(“人员”,20900个数据集):
id | name
--------------
1 | Peter
2 | Max
3 | Sam
... | ...
20900 | Rudi
和一个关系表(“友谊”,每个人有50到100个朋友):
personen_id_1 | personen_id_2
-------------------------
1 | 2
1 | 3
2 | 56
... | ...
20900 | 201
所以,有大约120万个关系。
现在我想成为id = 1的Person的朋友朋友,所以我精心设计了这样的查询:
select distinct P.name
from Friendships f
join Friendships f2 ON f.personen_id_2 = f2.personen_id_1
join Friendships f3 ON f2.personen_id_2 = f3.personen_id_1
join Friendships f4 ON f3.personen_id_2 = f4.personen_id_1
join Persons P ON f4.personen_id_2 = P.id
where f.personen_id_1 = 1
对于user-id 1
,查询占用了大约30秒在Neo4J中,我为每个人创建了一个具有一个名称属性的节点(20900节点)。所有节点的连接都与MySQL中的Friendships表相同,因此有120万个关系。
在这里得到相同的frinedset,我输入gremlin:
gremlin> g.v(1).outE.inV.loop(2){ it.loops <= 4 }.name.dedup.map()
这需要1分钟左右。我根本没想到这个!
我的比较也正确吗?如果是,如何修改此示例以显示使用neo4j执行此任务的优势?
答案 0 :(得分:1)
如果您知道自己正在进行4次循环,请执行以下操作:
g.v(1).out.out.out.out.name.dedup.map
Gremlin中存在一个已知的语义错误,其中loop()将转变为广度优先查询。 https://github.com/tinkerpop/pipes/issues/25
此外,如果你不需要,不要做outE.inV。等价物已经出来了。此外,意识到你正在进行4步搜索,即大规模计算(组合爆炸)。这是图数据库不擅长的东西。您将需要查看像Faunus这样的批量分析框架 - http://thinkaurelius.github.com/faunus/。有理由,请参阅http://thinkaurelius.com/2012/04/21/loopy-lattices/
图形数据库针对本地遍历进行了优化,通过4个步骤,您触摸(最有可能)整个数据集并使用“get get get”风格的数据库访问,这样做效率不高。
HTH, 马尔科。
答案 1 :(得分:0)
我对Gremlin并不过分熟悉,但我生成了一个类似大小的数据集(下面的统计数据)并在Cypher中运行了一个等效的查询:
START person=node:user(name={name})
MATCH person-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-friend
RETURN friend.name AS name
我针对数据集运行了1000次,每次选择不同的用户作为起点。在运行测试之前我没有给缓存加热,所以这是从一开始就开始的。平均响应时间:33毫秒。
在MacBook Pro上运行,2.2 GHz Intel Core i7,8 GB RAM,4 GB堆
以下是图表统计信息:
+----------------------------------------------+
| user | 20900 |
+----------------------------------------------+
| | Average | High | Low |
+----------------------------------------------+
| FRIEND |
+----------------------------------------------+
| OUTGOING | 74 | 100 | 48 |
| incoming | 74 | 123 | 31 |
+----------------------------------------------+
+----------------------------------------------+
| _UNKNOWN | 1 |
+----------------------------------------------+
| | Average | High | Low |
+----------------------------------------------+
+----------------------------------------------+
| Totals |
+----------------------------------------------+
| Nodes | 20901 |
| Relationships | 1565787 |
+----------------------------------------------+
| FRIEND | 1565787 |
+----------------------------------------------+