【问题标题】:Grouping nodes of the same label by parameter通过参数对相同标签的节点进行分组
【发布时间】:2018-06-29 10:15:53
【问题描述】:

我是图形数据库的新手,如果我弄错了一些正确的术语,敬请见谅。

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

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

【问题讨论】:

  • 作为一般的经验法则,我说标签适用于某些东西是或不是的属性,时间不会改变这一点。不过,性别有点奇怪。如果您使用遗传性别,标签会更容易/更好。对于性别认同,使用索引属性。 (标签基本上是一个索引,因此其行为几乎与属性索引相同)值得深思

标签: neo4j cypher


【解决方案1】:

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

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

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

但是,当前的 Cypher 规划器似乎拒绝在同一个查询中第二次使用统计信息(基于我的 PROFILE 运行),因此以下查询实际上会扫描数据库中的 Female 节点.希望这可以在未来的 Cypher 规划器中得到改进。

MATCH (m:Male)
WITH COUNT(m) AS males
MATCH (f:Female)
RETURN males, COUNT(f) AS females

[更新 1]

但是,正如@InverseFalcon 所建议的,使用UNION ALL 确实会导致每次都使用统计信息:

MATCH (m:Male) RETURN {male: COUNT(m)} AS counts
UNION ALL
MATCH (f:Female) RETURN {female: COUNT(f)} AS counts

[更新 2]

如果您想获取实际节点而不是计数,那么有 2 个答案具有大致相同的性能(如他们的PROFILEs 所示)。

  1. 您可以使用MaleFemale 标签:

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

    MATCH (m:Person {gender: 'male'})
    WITH COLLECT(m) AS males
    MATCH (f:Person {gender: 'female'})
    RETURN males, COLLECT(f) AS females
    

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

【讨论】:

  • 与此同时,这里有一个巧妙的密码技巧,它将使用 UNION ALL 来利用计数存储:MATCH (m:Male) RETURN {male:COUNT(m)} AS counts UNION ALL MATCH (f:Female) RETURN {female:COUNT(f)} AS counts
  • 我正在寻找要返回的实际节点,而不仅仅是它们的计数,但还是谢谢你们。
【解决方案2】:

您可以使用gender 属性为两个标签Person

下面的查询将返回一个带有两个元素的List,每个元素也是一个List。第一个元素是males,第二个是females

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

我不确定这是否是最好的查询。但它应该返回你需要的东西

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多