1

我是 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 背景,我仍在以关系数据库的方式思考这个问题,所以如果我的理论有误,请告诉我。

4

1 回答 1

3

I think this translates quite directly to neo. You could put the user nodes in an index and then query like you already stated:

start u=users(<USERID>) match u-[:SUBSCRIBES_TO]->c<-[:BELONGS_TO]-t return t order by t.AddedDate skip(<SKIPPED>) limit(<PAGESIZE>)

Unless i missed something you answered it already.

于 2013-03-01T14:18:01.357 回答