标签和属性在Neo4j中是否具有id值?

时间:2014-10-15 14:02:31

标签: neo4j

我知道节点和关系具有标识它们的整数值。标签和/或属性是否一样?通过给出节点ID和字符串来标识节点标记是否足够?也就是说,是否可以多次将同一标签分配给同一节点/关系?

3 个答案:

答案 0 :(得分:1)

所有节点和关系have IDs and can be looked up by their IDs。你可以这样做:

MATCH (n) WHERE id(n) = 5 RETURN n;

ID应被视为内部实现细节;不要依赖它们具有任何特定的价值或保持一致或有序,只需依靠它们来唯一地识别每个节点。

一般情况下,恕我直言,最好将自己有意义的标识符分配给可用于查找节点的节点(可能已编入索引),就像您将主键分配给关系数据库记录一样。

可以为多个节点分配标签;标签应该更多地被视为节点类,有点像ERD中的实体。通常标签可以是人物,公司,工作等。标签虽然与标识符没有多大关系。

答案 1 :(得分:1)

标签和属性在Neo4j中是否具有id值?

通过给出节点ID和字符串来识别节点标签是否足够?
如果你这意味着你在String变量中有节点id和标签值,那么是,它是。仅使用ID也足够了。

MATCH (n) WHERE ID(n) = 1234 RETURN n

更好:

MATCH (n:YourLabel) WHERE ID(n) = 1234 RETURN n

由于FrobberOfBits暗示,最好忽略(无理由)Neo在外部交互中附加到节点/关系的内部ID。这部分与Neo回收它的内部标识符有关(因此,如果您创建一个节点,它被分配ID 1,删除该节点,下一个创建的节点可以被分配ID 1) ,以及与暴露系统内部有关的部分内容。相反,您应该在需要时添加有意义的标识符或UUIDS。

使用您自己的标识符:

MATCH (n:YourLabel{uid:1234}) RETURN n

要快速查找,请将它们编入索引:

CREATE INDEX ON :YourLabel(uid)

是否可以多次为同一个节点/关系分配相同的标签?
节点可以包含您想要分配的标签(包括无),这在您想要维护Node"类型"的层次结构时非常方便。拥有一个标签可以让他们更快地查找,因为Neo有一个从哪里开始的提示。

关系只能有一种类型,而且该类型是不可变的。即如果要从类型HAS_A更改为HAD_A,您不能只更改类型,您必须删除并重新添加关系。

使用相同的关系类型或不同的关系类型,节点可以根据需要多次与另一个节点相关联。在性能方面,最好使用不同的关系类型,而不是在关系上使用属性,因为查找速度更快。

CREATE (p:Person{name:"Dave"}), (m:Pet), (d:Pet),
(p)-[:HAS_PET{type:"Cat"}]->(m),
(p)-[:HAS_PET{type:"Dog"}]->(d)

很好,原样:

REATE (p:Person{name:"Dave"}), (m:Pet), (d:Pet),
(p)-[:HAS_CAT]->(m),
(p)-[:HAS_DOG]->(d)

如果您想进行匹配所有狗的查询,现在哪个更快。如果Dave的狗被重新分配你就不能这样做:

MATCH (p:Person{name:"Dave"})-[rel:HAS_DOG]->()
SET rel:HAS_CAT

但你可以这样做:

MATCH (p:Person{name:"Dave"})<-[rel:HAS_PET{type:"Dog"}]-()
SET rel.type = "Cat"

但我可能错过了多项任务的问题。

答案 2 :(得分:1)

不确定你的目标是什么:

  • 是的,属性名称,重新类型和标签都有内部ID,它们不会存储为字符串

  • 您可以通过标签+属性+值来识别节点,如果您有唯一性约束,则可以识别一个

  • 您可以按标签识别节点(很多)