通过参数将相同标签的节点分组

时间:2018-06-29 10:15:54

标签: neo4j cypher

我是图形数据库的新手,如果我误解了一些正确的术语,就此道歉。

我正在使用Neo4j,它的数据集主要由一种节点组成。这些节点彼此之间以及图中的其他标记节点之间具有各种参数和关系。

要举一个我要实现的目标的简单示例,我们假设我有一个“ Person”标签。每个人都有一个名为“性别”的参数,其值将为“男性”或“女性”。如果我想运行一个查询,该查询将在一个变量中返回所有男性,而在另一个变量中返回所有女性,那么最佳实践是什么?它们应该是单独的标签吗?考虑到每个参数都相同,这似乎是个坏主意。

2 个答案:

答案 0 :(得分:1)

由于neo4j DB维护标签计数统计信息,因此使用MaleFemale标签将立即获得这些计数-甚至不需要执行任何节点查询。

例如,此查询从统计信息中获取Male个节点的数量:

MATCH (:Male)
RETURN COUNT(*) AS males

但是,当前的Cypher计划者似乎拒绝再次在同一查询中使用统计信息(基于我的PROFILE运行),因此以下查询实际上将在数据库中扫描{{ 1}}个节点。希望将来的Cypher计划者可以对此进行改进。

Female

[更新1]

但是,正如@InverseFalcon所建议的那样,使用MATCH (m:Male) WITH COUNT(m) AS males MATCH (f:Female) RETURN males, COUNT(f) AS females 确实会导致每次使用统计信息:

UNION ALL

[更新2]

如果要获取实际节点而不是计数,则有2个答案具有大致相同的性能(如它们的MATCH (m:Male) RETURN {male: COUNT(m)} AS counts UNION ALL MATCH (f:Female) RETURN {female: COUNT(f)} AS counts 所示)。

  1. 您可以使用PROFILEMale标签:

    Female
  2. 您可以在MATCH (m:Male) WITH COLLECT(m) AS males MATCH (f:Female) RETURN males, COLLECT(f) AS females 上创建索引:

    :Person(gender)

    但是,这种方法将需要更多的存储空间,因为您必须将性别属性存储在每个节点上。

答案 1 :(得分:0)

通过Person属性,您可以为两个标签都拥有一个标签gender

下面的查询将返回包含两个元素的List,每个元素也为List。第一个元素用于males,第二个元素用于females

MATCH (male {gender:'male'})
WITH COLLECT(male) AS maleList
MATCH (female {gender:'female'})
RETURN maleList, COLLECT(female)

我不确定这是否是最好的查询。但这应该可以给您所需的东西