Neo4J数据库建模 - 关系和父节点

时间:2014-12-01 07:04:50

标签: model neo4j

早上好,

我开始从关系数据库转移到Neo,从而转移我的表格思维"进入图形世界。考虑一个代表我的任务模块的模型,我需要将以下实体放在一起:

  • 客户
  • 任务
  • 用户

所以我提出了这个想法:

(CUSTOMER)-[:GENERATES]->(TASK) 
(USER)-[:IS_ASSIGNED_TO]->(TASK)

我正在思考当我要查询这个时,我会用标签TASK标记每个任务节点并具有属性作为属性,例如关闭,开放等。

现在查看所有打开的任务都可以通过

解决
MATCH (t:TASK {status:"open"}) -[:IS_ASSIGNED_TO]-> (u:USER) 
MATCH (c:Customer) -[:GENERATES]-> (t:TASK)
RETURN t.number as task_number, c.name as customer_name, u.name as user_name

在创建节点和关系时,我想知道我是否只是为任务创建一个节点,一个用于用户,一个用于客户,并像上面的模型一样连接它们,或者我是否需要像#34;父母一样-node"每个节点类型,例如GENERAL_USER,GENERAL_TASK和GENERAL_CUSTOMER,并将每个单个节点连接到该父节点,并具有覆盖当前状态的关系。背后的想法是,当我想要打开任务时,我可以更容易地从GENERAL_TASK节点开始,并查找所有关系到状态为OPEN的任务,而不是查找可能位于DB中的每个节点。这比要求DB返回具有内容为OPEN的属性状态的所有TASK节点(即使它被编入索引)要快吗?

很高兴有一些意见,以更好地了解如何建模数据库和关系。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

所以我认为你在这里思考正确的方向。在选择最佳建模数据时,查询模式非常重要。

一般来说,neo4j的设置使得遍历关系便宜。因此,作为一般的经验法则,在关系中导航比在具有特定属性值的节点扫描所有节点方面更便宜。

如果某个任务的状态分组将是您经常查询的内容,那么将任务链接到那个" class"你的模型中的任务可能是有道理的。只需确保正确维护这些链接即可。缺点之一是节点可能链接到两个不同的状态(在您的模型下可能没有意义),而如果节点具有状态"属性",那么它只能一次只有一个值。随着您的任务得到处理,其状态将发生变化,您的代码需要确保所有任务都链接到一个且只有一个状态。

让我们假设你有一个离散变量(也就是说,一个只能取一组固定值的变量,比如说一个状态代码,或一个" status" flag) 。什么时候应该将它作为一个单独的节点,何时应该将其作为节点属性?没有硬性和快速的答案,但这里有一些指导原则:

表明它应该是节点的事情

  1. 经常需要按此特定值过滤大型结果集
  2. 它与多个节点类型相关(即任务具有状态,但用户也可能与某些状态相关联)
  3. 表明它应该属于财产的事情

    1. 它仅与一种节点类型相关
    2. 值的数量非常小(即<5)
    3. 基于该属性的不经常查询