【问题标题】:Neo4j Best Practice for Index on Relationship Property?Neo4j 关系属性索引的最佳实践?
【发布时间】: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 是否是正确的选择。

【问题讨论】:

标签: postgresql neo4j


【解决方案1】:

好的,我似乎找到了 Neo4J 工作人员的官方回答。 https://community.neo4j.com/t/how-can-i-use-index-in-relationship/1627/2

来自帖子:

我们建议重构您的模型。如果您需要对某事物执行索引查找,这通常表明该事物最好建模为节点。作为节点,您可以创建快速查找所需的索引和约束。

所以我将“阻塞”建模为一个节点并在blocked.blockeduntil上创建一个索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多