早上好,
我开始从关系数据库转移到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节点(即使它被编入索引)要快吗?
很高兴有一些意见,以更好地了解如何建模数据库和关系。谢谢你的时间。
答案 0 :(得分:1)
所以我认为你在这里思考正确的方向。在选择最佳建模数据时,查询模式非常重要。
一般来说,neo4j的设置使得遍历关系便宜。因此,作为一般的经验法则,在关系中导航比在具有特定属性值的节点扫描所有节点方面更便宜。
如果某个任务的状态分组将是您经常查询的内容,那么将任务链接到那个" class"你的模型中的任务可能是有道理的。只需确保正确维护这些链接即可。缺点之一是节点可能链接到两个不同的状态(在您的模型下可能没有意义),而如果节点具有状态"属性",那么它只能一次只有一个值。随着您的任务得到处理,其状态将发生变化,您的代码需要确保所有任务都链接到一个且只有一个状态。
让我们假设你有一个离散变量(也就是说,一个只能取一组固定值的变量,比如说一个状态代码,或一个" status" flag) 。什么时候应该将它作为一个单独的节点,何时应该将其作为节点属性?没有硬性和快速的答案,但这里有一些指导原则:
表明它应该是节点的事情
表明它应该属于财产的事情