【问题标题】:Cypher query to return one relationship per type in a neo4j graphCypher 查询以在 neo4j 图中为每种类型返回一个关系
【发布时间】:2023-03-13 05:45:01
【问题描述】:

是否有一个 Cypher 查询来返回图表中每个关系类型的单个关系?

例如,我有一个图表,其中包含 5 个类型为 TYPE_X 的关系、10 个类型为 TYPE_Y 的关系和 1 个类型为 TYPE_Z 的关系。该查询将返回 3 个关系:

()-[r1:TYPE_X]->()
()-[r2:TYPE_Y]->()
()-[r3:TYPE_Z]->()

哪个TYPE_X 关系返回为r1 并不重要。理想情况下,查询不必扫描每个关系,它只需为每种类型返回一个任意关系。

此查询对于在交互式浏览器中询问关系类型及其属性很有用。


更新基于@christophe-willemsen 的answer

我使用了以下查询:

MATCH ()-[r]->()
RETURN type(r) AS rel_type, collect(r)[0] AS example

生成以下visualization,每种类型都有一个关系:

【问题讨论】:

    标签: types neo4j cypher relationship


    【解决方案1】:

    为每种类型选择一个随机关系

    在 Neo4j 3.0.1 中,我一直在使用以下命令为每种类型选择一个随机关系。

    MATCH ()-[r]->()
    WITH type(r) AS rel_type, collect(r) AS rels
    WITH rel_type, rels, toInt(rand() * size(rels)) AS idx
    RETURN rel_type, rels[idx] AS example
    

    它基于@christophe-willemsen's answer,并在关系集合上添加了随机索引查找。

    【讨论】:

      【解决方案2】:

      其实这很简单,你只需要聚合关系类型:

      MATCH (a)-[r]->(b)
      RETURN type(r), collect(r)[0] AS oneRel
      

      -

      REL3    (34)-[20:REL3]->(35)
      REL2    (18)-[12:REL2]->(19)
      REL1    (6)-[6:REL1]->(7)
      

      【讨论】:

      • 谢谢。我使用此查询生成的可视化更新了我的问题。作为参考,这个查询首先执行了一个AllNodesScan,它命中了每个节点,第二个执行了一个Expand(All),它命中了每个关系。使用 2.3.2 成本规划器,查询在 my hetnet 上花费了 9 秒,有 50,000 个节点和 300 万个关系。
      猜你喜欢
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多