【问题标题】:How Can I Replicate This SQL Sub Query In Neo4j我如何在 Neo4j 中复制这个 SQL 子查询
【发布时间】:2013-02-16 01:07:54
【问题描述】:

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

【问题讨论】:

    标签: subquery neo4j cypher


    【解决方案1】:

    我认为这可以直接转化为 neo。 您可以将用户节点放在索引中,然后像您已经说过的那样查询:

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

    除非我错过了你已经回答的问题。

    【讨论】:

    • 感谢您的快速回答。我真正关心的是这个查询的速度和效率。如果我运行这个查询,Neo4j 是否会扫描用户链接到的每个文本节点,然后按日期对它们进行排序,然后返回请求的范围。一个用户可能链接到超过 1,000,000 个文本节点。是否可以使用索引按日期顺序扫描文本节点,以便只扫描所需的最小值?
    • 我不确定这是如何在内部性能方面进行优化的。不幸的是,据我所知,neo4j 中没有等效的排序索引。根据我的个人经验,即使对于大量节点/关系,在 SQL 中使用多个连接的查询也运行得非常快。您是否在测试中获得不合理的表现?如果性能是一个真正的问题,它有时会比使用 cypher 来制作 gremlin 查询。
    • 感谢您的回答,感谢您告诉我没有排序索引。整个应用程序目前还只是纸上谈兵,我只是想确定 Neo4j 是否适合我的需求。我会更多地研究 Gremlin,这是我直到现在才研究的东西。
    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2012-04-08
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多