0

最近我在学校有一个作业来比较 MySQL 和 Neo4j。

我阅读了“Graph Databases”一书和“Neo4j in Action”一书的第一章,在这两本书中,它们都展示了 MySQL 和 Neo4j 之间的不同之处在于当你想查询“朋友的朋友的朋友......一个人的朋友”时”。

我在这里关注了 Joerg Baach 先生与 mysql 相比的 neo4j 性能(如何改进?)并得到相同的结果。MySQL 添加索引后速度很快,Cypher 无法及时得到结果。

后来我决定使用 Traversal Framework。这是我的查询:

for (Path p: t.description()
                .depthFirst()
                .relationships(RelTypes.friend, Direction.OUTGOING)
                .evaluator(Evaluators.atDepth(4))
                .uniqueness(Uniqueness.NODE_LEVEL)
                .traverse(graphDb.index()
                        .forNodes("node_auto_index")
                        .get("noscenda_name", "person3200")
                        .getSingle()))
{
      //....
}

现在我必须测量返回结果需要多长时间。我阅读了Neo4j Traversal API的手册

Traverser 对象是调用 TraversalDescription 对象的 traverse() 的结果。它表示位于图中的遍历,以及结果格式的规范。每次调用 Traverser 的迭代器的 next() 方法时,都会延迟执行实际的遍历。

每次调用 next() 方法时都会执行实际的遍历。所以如果我想测量我必须等待循环结束的时间。我对吗?

如果我是对的,Traversal API 的性能非常糟糕,因为它需要大约 60 秒才能返回深度 4 的结果。有什么提高性能的建议吗?

4

1 回答 1

0

这可能是一个独特性问题,其中遍历了不必要的关系。你可以做:

遍历器 遍历器 = t.description()
                .depthFirst()
                .relationships(RelTypes.friend,Direction.OUTGOING)
                .evaluator(Evaluators.atDepth(4))
                .uniqueness(唯一性.NODE_LEVEL)
                .traverse(graphDb.index()
                        .forNodes("node_auto_index")
                        .get("noscenda_name", "person3200")
                        .getSingle());
for ( 路径 p : 遍历器 ) { ... }
traverser.metadata().getNumberOfRelationshipsTraversed() / getNumberOfPathsReturned()

看看它与您执行的其他查询相比如何。也许你可以试试 Uniqueness.NODE_PATH。

另一方面:列出所有深度 4 用户的用例是什么?这总是很多。如果您尝试一个更现实的用例并与之进行比较,那将如何叠加?

于 2013-10-01T07:00:42.450 回答