我是 Neo4j 和图形数据库的新手,但我有关系数据库的背景。
我的问题是关于如何在 Neo4j 中有效地复制 SQL Server 查询的建议。
我正在开始一个我认为适合 Neo4j 的新项目,因为我必须存储许多朋友的朋友类型的关系。我正在使用 Neo4j 1.8.1 和 C# 来编写我的应用程序
我项目的一部分有一个结构类似于 Twitter 的部分,这就是我需要帮助的地方。
我将使用 Twitter 类比来解释我的问题:
我有一个文本 blob(推文)列表,每个 blob 可以属于 0、1 或多个类别(哈希标签)。与 Twitter 不同,我也有链接到 0、1 或多个类别的用户。
我认为图表看起来像这样:
T = 文本 blob 节点,C = 类别节点,U = 用户节点
T-------C-------U
\_____/ \_____
/ \ \
T-------C-------U
\_____
\
T-------C-------U
_____/ \_____
/ \
T U
当应用程序运行时,我估计将有大约 10,000,000 条记录(我可能会归档更多),大约 100 个类别和大约 1000 个用户。
目前我有一个简单的 SQL Server 数据库来测试这个:
__________ ______________ ___________ ______________ ________ |正文 | |文本类别 | |类别 | |用户类别 | |用户 | |-----------| |---------------| |-----------| |---------------| |--------| |TextId |-----|TextId |------|CategoryId |-----|UserId |----|UserId | |正文 | |类别 ID | |姓名 | |类别 ID | |姓名 | |添加日期 | |添加日期 | |-----------| |---------------| |--------| |-----------| |---------------|
通过将 DateAdded 字段从 Text 表复制到 TextCategory 表并向 2 个链接表添加索引,我可以运行以下查询以返回属于用户订阅的类别的所有文本项,按日期排序:
SELECT t.*
FROM Text t
INNER JOIN tc TextCategory ON tc.TextId = b.TextId
WHERE tc.CategoryId IN
(
SELECT CategoyId
FROM UserCategory
WHERE UserId = @UserId
)
ORDER BY tc.AddedDate
实际上,我会对结果进行分页,但为简单起见,我将其省略了。
如何有效地在我的 Neo4j 数据库中复制此查询?在 Cypher 中可以进行这样的子查询吗?
如果我使用这样的东西:
u-[:SUBSCRIBES_TO]->c<-[:BELONGS_TO]-t
(我的 Cypher 技能还很幼稚)
我可以扫描文本节点,但无法对用户使用索引。我最终会检查每个文本节点以查看它是否链接到用户。
如果我扫描与用户链接的所有关系,我将无法利用文本节点上的日期排序索引来页面结果,例如避免扫描所有节点以找到最早的 10 个。
正如我所提到的,我来自 RDBMS 背景,我仍在以关系数据库的方式思考这个问题,所以如果我的理论有误,请告诉我。