什么时候使用Property而不是Neo4j中的Label?

时间:2016-04-14 23:30:58

标签: neo4j cypher

我正在讨论这个YouTube tutorial,“在真实世界中使用LOAD CSV”。

本教程展示了如何获取CSV,其中每一行都是针对某个银行的投诉,并将其建模为Neo4j字典。

这样做时,叙述者在“投诉”节点上设置“属性”:

CREATE (complaint:Complaint {id: line.`Complaint ID`})
SET complaint.year= TOINT(date[2]),
     complaint.month= TOINT(date[0]),
     complaint.day = TOINT(date[1])  

我对一个小点感到困惑 - 是什么让这个日期信息更像是一个'Property'而不是Label?

这可以建模而不是节点将此信息封装为标签而不是属性吗?在什么时候你需要其中一个而不是另一个?

2 个答案:

答案 0 :(得分:4)

标签和属性是完全不同的东西。

property属于某个节点或关系,并且具有名称和值。

节点label在概念上类似于"类名",并且没有价值。

因此,谈论将日期值放在"标签"中没有任何意义。您只能在属性中放置一个值。

但请注意,人们经常使用标签名称(例如," Foo")作为具有Foo标签"的节点的简写。例如,他们可能会说"将日期存储在Foo"当它们实际意味着"将日期存储在具有标签Foo"的节点的适当属性中。也许这就是造成混乱的原因。

答案 1 :(得分:1)

正如cybersam在他的回答中指出的那样,标签不能包含价值观。它们只是......标签。像标签一样。采取稍微不同的方向:

很久很久以前,在很远很远的版本中,Neo4j没有标签。因此,如果您想识别特定类型的节点(例如...... Person)......您可能会包含属性+值,例如nodeType = 'Person'。然后,您将在查询中包含一个过滤器,例如:

WHERE node.nodeType = 'Person'

标签使这种属性类型过时,并且也是可索引的。此外,您可能在节点上有多个标签(这将要求您的遗留nodeType属性为数组,而不是搜索效率高。

所以:用于标记/索引的标签。保留值的属性。