从本地Neo4j数据库中的所有节点获取单个字段的最快方法

时间:2015-07-27 06:55:13

标签: neo4j

我在本地运行一个Neo4j数据库,用于存储个人信息。我目前使用Alfred用于OS X搜索字段" key"每个节点都有。当输入我的查询的每个字符时,Alfred会快速过滤匹配列表。为了做到这一点,阿尔弗雷德需要一个带有"键"的列表。与数据库中的每个节点关联的字段。生成此列表的一种方法是使用neo4j-shell

neo4j-shell -c 'match (n) return n.key;'

不幸的是,这个查询需要大约1500毫秒,这对我的目的来说是不可接受的。因此,我使用一种解决方法,其中cron作业定期将该组键转储为由key字段命名的一组空存根文件。 OS X Spotlight会对这些文件编制索引,而Alfred会使用Spotlight索引。这提供了出色的搜索性能,但是搜索的文件列表仅与最后一次转储一样是最新的。我想直接点击Neo4j数据库,以便我总是搜索完整的节点列表。

从本地Neo4j数据库中的所有节点获取单个字段的最快方法是什么?

3 个答案:

答案 0 :(得分:3)

这是一个缓存问题,它第一次运行查询时必须从磁盘加载数据。

您可能想要使用DISTINCT:match (n) return distinct n.key;

您可能还想为节点使用标签。

更新版本的Neo4j,如2.3-M02也应该更快。

答案 1 :(得分:0)

  1. 如果可能的键数远远小于所有节点的数量,您可以尝试将键保存在单独的节点中(使用单独的标签),并将它们连接到具有关系的父节点。然后仅从新节点类型获取密钥集。

  2. 只有当用户输入部分查询时(即查询至少包含2-3个字符),您才可以在密钥上创建索引并询问密钥列表。因此,如果用户已输入" fo",请运行查询

    匹配(n)其中n.key =〜' fo。*'返回n.key

  3. 如果他只输入信件,不做任何事情,不进行搜索。

答案 2 :(得分:0)

我通过设置一个带有单个端点" keys"的简单Ruby API解决了这个问题。 API使用neo4j-core gem从数据库中获取密钥列表并将其作为纯文本返回。我保持API不断运行。这比neo4j-shell快得多,我猜是因为shell的启动时间。