图数据库中的数据组织

问题描述 投票:0回答:1

这与其说是一个技术问题,不如说是一个逻辑问题。我请求对我的要求进行数据组织指导。请记住,我愿意为此目的使用图数据库(虽然我在这方面是个新手)。所以非常感谢在图数据库背景下的指导。

让我提供一个场景的概述。在应用程序中有两个实体。UserHouse. 用户可以 ownsrents 一间房子。如果一个用户 rents (a) 在租房时,应注明用户租用该房屋的时间段。一个用户可以在不同的时间段内租用同一房屋。

演示数据集。

A (User) -owns-> H1, H2, H3 (House) - one-liner for brevity
X -rents-> H2 (start=DATE1, end=DATE2)
Y -rents-> H2 (start=DATE3, end=DATE4)
X -rents-> H2 (start=DATE5, end=DATE6) - user rents same house again

我假设 UserHouse 将是节点和 ownsrents 将是边缘。租期将是属性的 rents 边缘。如果有什么更好的方法,请大家指点。

问题。

  1. 在图数据库中,两个节点之间是否可以有多条相同类型的边?我是否应该只保留一条边,用于特定用户对特定房屋的租金,并增加周期?还是应该为多个时期保留多条边?
  2. 是否可以查询到类似 "获取所有空置了3个月的房子"?这样应该可以提取出租金中连续结束日期和下次开始日期之间有3个月差距的房子。这些房子现在可能不是空的。
  3. 我查过neo4j,cayley,dgraph等。在这种情况下,哪个可能更好?

任何指导我应该如何保持数据与关系将是非常感激的。祝您愉快。

database relationship graph-databases
1个回答
0
投票

可能有比这个更好的答案,还是把我的使用图的经验贴在给定的需求上,如果这对你有帮助的话。

我认为对于你的需求,回答你的问题,最适合用图数据库。

  1. 这更多的是设计你的图模型以适应目的,我认为你可以有多个不同时期的租金边,从节点用户到节点房子.哪种方式你可以维护历史,你可以以后删除旧的过期时期边,如果你想。

    [只是为了避免重复]假设这里你需要确保只有当周期槽是空闲的时候,才会在节点(user & house)之间创建边缘。你可以在创建节点之间的边缘时,在查询中添加逻辑。

  2. 通过给定的演示数据集,下面是我根据你所描述的场景创建的示例图。

http:/console.neo4j.org?id=bxu3sp

点击上面的控制台链接,可以在底部的查询窗口中运行下面的cypher查询。

    MATCH (user:User)-[rent:RENT]->(house:House) 
    WITH house, rent
    ORDER BY rent.startDate
    WITH collect(rent) as rents, house
    UNWIND range(0, size(rents)-1) as index 
    WITH rents, index, house 
    WHERE duration.inDays(date(rents[index].endDate), date(rents[index+1].startDate)).days > 30 
    RETURN house

这将得到在给定时期范围内没有分配的房屋列表。

  1. 我不是专家,也从来没有用过其他的neo4j,目前以我在neo4j上的经验来看,文档真的很好,而且它的功能很强大,增加了Kafka集成、GraphQL、Halin监控、APOC等功能。

我想说的是,这是一个学习曲线,只要探索和玩转它,就能让自己进入图DB世界。

更新一下。如果同一个用户在不同的时间段租了同一栋房子,那么这个图就会像下面所说的那样,你应该通过不允许任何用户节点和任何房子节点之间的相同重叠窗口期的边来避免创建重复。在这个图中,我已经为不同的和不重叠的开始日期创建了边,所以哪个是有效的,而不是重复的。

Graph

© www.soinside.com 2019 - 2024. All rights reserved.