创建索引是否需要标签?

时间:2018-11-26 19:13:17

标签: java neo4j

在将Neo4j与Cypher结合使用时,我从未对标签的属性进行过第二次思考,认为标签可以独立于标签而存在。

没有标签

MATCH (n {displayName:"Macroautophagy"} ) RETURN n;

带有标签

MATCH (n:Pathway {displayName:"Macroautophagy"}) RETURN n;

直到我将同时使用Core API和Cypher的Java转换为纯Core API。

主要原因是我的测试数据库很小,查询大约在同一时间运行,但是对于large数据库,两者之间的运行时间差是几分钟或更长时间。

当我去转换仅基于属性值的查询并搜索Core API时,我只found findNodefindNodes,其中每个人都需要一个{{1 }}参数,然后我开始考虑Neo4j如何在没有标签的情况下执行第一个查询。

在阅读indexes的文档时,

  

Cypher允许在具有给定标签的所有节点的一个或多个属性上创建索引:

     

在单个属性上为任何给定标签创建的索引为   称为单属性索引。
  在一个给定标签的多个属性上创建的索引称为复合索引。

尽管我现在相当有把握,但我现在已经很了解我了,因为对于将Neo4j与Java API结合使用是新手,我不想错过任何事情。

如果在Java中使用Neo4j Core API搜索具有属性且未提供标签的节点,那么查找该节点的唯一方法是对所有寻找该属性的节点进行全面扫描?

如果答案为否,那么答案必须包括一个示例,该示例显示了使用Java中Neo4j Core API的更快方法。正如我指出的,它作为Java中调用的Cypher查询一直很好,因此不会接受Cypher示例。

如果答案是肯定的,那么除了我提到的内容之外,我还需要一些支持Neo4j的文档。原因是任何人都可以说是,但我无法根据一个编码示例对其进行验证。


值得深思。

我想我从未想到需要标签的索引的原因是,在有关图数据库的所有阅读中,它们都强调数据的存储方式不像表一样,当考虑到关系数据库中的索引时,您会认为索引与表一起使用。当您打破了不在表中的数据的概念时,默认情况下,与表相关的索引的概念随处可见,并且除了值以外,它与任何其他事物均不相关,所以我想,但是显然,在这种情况下,您学到的越多,保持不变。

1 个答案:

答案 0 :(得分:3)

  

如果在Java中使用Neo4j Core API搜索具有属性的节点   并且没有给出标签,那么找到节点的唯一方法是   完整扫描所有寻找该属性的节点?

是,不是。

  • 标准neo4j“模式索引”始终与标签关联。您已经在此引用了neo4j documentation

  • 但是,manual indexes(也称为“旧版”或“显式”索引)不需要标签。仅在特殊情况下才建议使用手动索引,例如fulltext searches,并且与架构索引相比,使用它们要复杂得多。因此,如果您有一个合适的用例,并且愿意付出很多额外的精力,那么您确实可以拥有不与标签相关联的索引。

  

...显然,在这种情况下,您学得越多,就越能保持不变。

neo4j索引和关系索引之间存在主要差异。

  • 关系型数据库使用索引来加快表行之间的联接
  • neo4j根本不使用其索引来进行“联接”(关系遍历)。相反,索引仅用于快速查询中的 initial 节点。随后,遍历节点之间的关系仅需要使用直接寻址,这要快得多。