Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 按参数对同一标签的节点进行分组_Neo4j_Cypher - Fatal编程技术网

Neo4j 按参数对同一标签的节点进行分组

Neo4j 按参数对同一标签的节点进行分组,neo4j,cypher,Neo4j,Cypher,我是图形数据库的新手,如果我把一些正确的术语弄错了,我深表歉意 我使用的是Neo4j,数据集主要由一种节点组成。这些节点彼此之间以及图中其他标记节点之间具有各种参数和关系 为了给我一个简单的例子来说明我想要实现的目标,让我们假设我有一个“人”的标签。每个人都有一个名为“性别”的参数,其值为“男性”或“女性”。如果我想运行一个查询,在一个变量中返回所有男性,在另一个变量中返回所有女性,那么最佳做法是什么?它们应该是单独的标签吗?这似乎是一个坏主意,因为每个属性上的参数都是相同的。您可以为这两个属性

我是图形数据库的新手,如果我把一些正确的术语弄错了,我深表歉意

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


为了给我一个简单的例子来说明我想要实现的目标,让我们假设我有一个“人”的标签。每个人都有一个名为“性别”的参数,其值为“男性”或“女性”。如果我想运行一个查询,在一个变量中返回所有男性,在另一个变量中返回所有女性,那么最佳做法是什么?它们应该是单独的标签吗?这似乎是一个坏主意,因为每个属性上的参数都是相同的。

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

下面的查询将返回一个包含两个元素的
列表
,每个元素都是
列表
。第一个元素用于
男性
,第二个元素用于
女性

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

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

,因为neo4j DB维护标签计数统计,使用
男性
女性
标签将立即获得这些计数,甚至不需要进行任何节点查询

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

MATCH (:Male)
RETURN COUNT(*) AS males
但是,当前的Cypher planner似乎拒绝在同一个查询中再次使用统计信息(基于我的运行),因此下面的查询实际上会扫描数据库中的
女性节点。希望这能在未来的密码规划者中得到改进

[更新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]

如果希望获得实际节点而不是计数,则有两个性能大致相同的答案(如它们的
配置文件所示)

  • 您可以使用
    男性
    女性
    标签:

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

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


  • 同时,这里有一个简洁的密码技巧,它将利用计数存储使用UNION ALL:
    MATCH(m:Male)RETURN{Male:COUNT(m)}作为计数UNION ALL MATCH(f:Female)RETURN{Female:COUNT(f)}作为计数
    我正在寻找要返回的实际节点,而不仅仅是它们的计数,但还是要谢谢你。作为一个一般的经验法则,我说标签是用于属性的,这些属性要么是,要么不是,时间不会改变这一点。不过,性别有点奇怪。如果你使用的是基因性别,标签会更容易/更好。对于性别标识,请使用索引属性。(标签基本上是一个索引,因此其行为与属性索引几乎相同)这是值得思考的
    MATCH (m:Male)
    WITH COLLECT(m) AS males
    MATCH (f:Female)
    RETURN males, COLLECT(f) AS females
    
    MATCH (m:Person {gender: 'male'})
    WITH COLLECT(m) AS males
    MATCH (f:Person {gender: 'female'})
    RETURN males, COLLECT(f) AS females