【发布时间】:2019-09-06 11:23:33
【问题描述】:
我正在尝试将 PostgreSQL 数据库迁移到 Neo4j 并在 PostgreSQL 中具有以下 m-n 关系: 用户-(被阻止)-用户
所以在 PostgreSQL 中,我有一个额外的表“阻塞”,其中包含以下列:userid1、userid2、blockedsince、blockeduntil 我在blocked.blockeduntil 上也有一个索引,用于搜索阻塞结束后最终必须删除的行。
如何在 Neo4j 中建立包括索引在内的这种关系?
我已经在 Neo4j 的节点类型“用户”中包含了所有用户行。 下一步将是创建一个从用户到用户的称为“已阻止”的关系。 所以基本上是这样的: (user)-[:blocked]->(user) 我会在关系中添加 2 个关系属性“blockeduntil”和“blockedsince”。但是似乎无法在关系属性blocked.blockeduntil上创建索引
PostgreSQL 原代码:
CREATE TABLE user (
UserId bigserial NOT NULL PRIMARY KEY,
...
);
CREATE TABLE blocked(
UserId1 bigint NOT NULL references user(UserId),
UserId2 bigint NOT NULL references user(UserId),
BlockedSince timestamp NOT NULL,
BlockedUntil timestamp NOT NULL,
PRIMARY KEY (UserId1, UserId2)
);
CREATE INDEX "IdxBlocked" on blocked(blockeduntil);
我在 Neo4j 中的第一种方法:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///blocked.csv" AS row
MATCH (u1:user {userid: toInteger(row.userid1)})
MATCH (u2:user {userid: toInteger(row.userid2)})
MERGE (u1)-[b:BLOCKED]->(u2)
ON CREATE SET b.blockedsince = localdatetime(replace(row.blockedsince, " ", "T")), b.blockeduntil = localdatetime(replace(row.blockeduntil, " ", "T"));
实现这种关系的最佳实践是什么,包括blockeduntil上的索引?像这样创建一个名为“blocked”的新节点类型会更好吗?
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///blocked.csv" AS row
CREATE (:blocked{userid1: toInteger(row.userid1), userid2: toInteger(row.userid2), blockedsince: localdatetime(replace(row.blockedsince, " ", "T")),
blockeduntil: localdatetime(replace(row.blockeduntil, " ", "T"))});
然后像这样在blocked.blockeduntil上创建一个索引?
CREATE INDEX ON :blocked(blockeduntil);
在我的研究过程中,我偶然发现了显式索引 Explicit Indexes,但它们似乎已被弃用。我也不确定Full Text Indexes 是否是正确的选择。
【问题讨论】:
-
请参阅 stackoverflow.com/a/39754595/974731 获取建议。
-
谢谢!因此,按照您的建议,我将更改我的数据模型并使节点类型“阻塞”,以便我可以使用blocked.blockeduntil 进行索引。
-
根据来自 Neo4J 员工的 community.neo4j.com/t/how-can-i-use-index-in-relationship/1627 帖子,将此类实体建模为节点而不是关系似乎是最佳实践。所以我想我会将“阻塞”建模为节点类型。
标签: postgresql neo4j