我使用Neo4j作为主数据库构建一个小型Web应用程序。我的所有节点(~700,000)都有一个共同的属性,比如name
。我使用Java(Jax-rs)为Neo4j服务器构建了一个非托管扩展。
我想要做的是能够快速获取name
与某些模式匹配的节点。我认为存储所有节点的列表(已经排序)会更容易,但我的问题是我应该怎么做。对于webApp,我使用Node.js和React(使用Redux架构),如果这是相关的。
首先,我应该使用我的Neo4j的非托管扩展,以及
创建一个属性等于所有其他节点列表的节点,并根据该节点的属性进行计算
使用非托管扩展来访问服务器上的文件,并对该文件进行读/写以获得我想要的内容。在那种情况下,我不会使用Neo4j api,但我不必运行其他数据库
另一种可能性是使用像MongoDb这样的其他数据库并从Node.js连接到这个数据库。甚至可以直接从Node.js读取/写入文件。
这些是我现在可以想到的选项,我希望我已经足够清楚了。什么是最佳做法?
感谢您的帮助,
答案 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
然后继续查询其余部分。
这将在您加载数据时执行一次处理,而不是每次查询时。如果你的数据是相当静态的,那么额外的复杂性和写作时间就会非常值得。