如何在Neo4j中复制此SQL子查询

时间:2013-03-01 13:48:24

标签: subquery neo4j cypher

我是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数据库来测试它:


     __________         ______________        ___________       ______________      ________
    |Text      |       |TextCategory  |      |Category   |     |UserCategory  |    |User    |
    |----------|       |--------------|      |-----------|     |--------------|    |--------|
    |TextId    |-------|TextId        |------|CategoryId |-----|UserId        |----|UserId  |
    |Text      |       |CategoryId    |      |Name       |     |CategoryId    |    |Name    |
    |DateAdded |       |DateAdded     |      |-----------|     |--------------|    |--------|
    |----------|       |--------------|

通过将DateAdded字段从Text表复制到TextCategory表并将索引添加到2个链接表,我可以运行以下查询以返回属于用户按日期排序的类别的所有文本项:< / p>

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

1 个答案:

答案 0 :(得分:3)

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

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

除非我错过了你已回答的内容。