我应该如何存储按字母顺序排列的节点列表'在Neo4j中的名字?

时间:2016-10-11 08:48:58

标签: node.js data-structures neo4j

我使用Neo4j作为主数据库构建一个小型Web应用程序。我的所有节点(~700,000)都有一个共同的属性,比如name。我使用Java(Jax-rs)为Neo4j服务器构建了一个非托管扩展。

我想要做的是能够快速获取name与某些模式匹配的节点。我认为存储所有节点的列表(已经排序)会更容易,但我的问题是我应该怎么做。对于webApp,我使用Node.js和React(使用Redux架构),如果这是相关的。

首先,我应该使用我的Neo4j的非托管扩展,以及

  1. 创建一个属性等于所有其他节点列表的节点,并根据该节点的属性进行计算

  2. 使用非托管扩展来访问服务器上的文件,并对该文件进行读/写以获得我想要的内容。在那种情况下,我不会使用Neo4j api,但我不必运行其他数据库

  3. 另一种可能性是使用像MongoDb这样的其他数据库并从Node.js连接到这个数据库。甚至可以直接从Node.js读取/写入文件。

    这些是我现在可以想到的选项,我希望我已经足够清楚了。什么是最佳做法?

    感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

根据请求,一个(用于设计)用叶子节点为复杂查询预先绘制图表的示例:假设您希望用户能够查询以查找具有name属性的所有节点全是小写(说它代表一个假名)。如果您对此基本查询运行EXPLAIN,您会发现它执行NodeByLabelScan或更糟糕的AllNodesScan,因为您无法对索引执行此操作。因此,当您添加节点时,您将MERGE与叶节点建立关系,表示其name属性是否满足此条件:

MERGE (a:DataNode)
SET a = {input}
WITH COLLECT(a) AS datanodes
WITH datanodes, [b IN datanodes WHERE b.name = lower(b.name)] AS lowers
FOREACH(lower IN lowers|
    MERGE (q:QueryLeaf {condition:'all_lowercase', match: True})
    MERGE (q) - [:INCLUDES] -> (lower) )

然后,当您收到“小写”查询时:

MATCH (q:QueryLeaf {condition:'all_lowercase', match: True})
WITH q
MATCH (a:DataNode) <- [:INCLUDES] - (q)
WITH a

然后继续查询其余部分。

这将在您加载数据时执行一次处理,而不是每次查询时。如果你的数据是相当静态的,那么额外的复杂性和写作时间就会非常值得。