【问题标题】:Neo4j: get all relations between queried nodesNeo4j:获取查询节点之间的所有关系
【发布时间】:2017-09-07 12:52:46
【问题描述】:

我想进行以下任务的密码查询:

  1. 有一个给定的起始节点,我想在 2 跳内获取所有相关节点
  2. 按跳数升序对查询的节点进行排序,并限制给定数量
  3. 并获得 1 结果之间的所有关系。

我尝试了很多查询,并针对步骤 1、2 进行了以下查询

MATCH path=((start {eid:12018})-[r:REAL_CALL*1..2]-(end))
WITH start, end, path
ORDER BY length(path) ASC
RETURN start, collect(distinct end)[..10]

但是当我尝试使用以下查询获取查询路径中的关系时,它会返回路径中的所有关系:

MATCH path=((start {eid:12018})-[r:REAL_CALL*1..2]-(end))
WITH start, end, path
ORDER BY length(path) ASC
RETURN start, collect(distinct end)[..10], relationships(path)

我认为我必须再次匹配第一次匹配的结果,而不是直接从路径获取关系,但我所有的尝试都失败了。

如何获取查询节点之间的所有关系? 有帮助的不胜感激,非常感谢。

【问题讨论】:

    标签: neo4j path cypher graph-databases


    【解决方案1】:

    [编辑]

    这样的事情可能对你有用:

    MATCH (start {eid:12018})-[rels:REAL_CALL*..2]-(end)
    RETURN start, end, COLLECT(rels) AS rels_collection
    ORDER BY
      REDUCE(s = 2, rs in rels_collection | CASE WHEN SIZE(rs) < s THEN SIZE(rs) ELSE s END)
    LIMIT 10;
    

    COLLECTaggregation function 将为每个不同的start/end 对生成一个(关系集合的)集合。 LIMIT 子句基于 ORDER BY 子句将返回的结果限制为前 10 个 start/end 对。 ORDER BY 子句使用REDCUE 计算到给定end 节点的每个路径的最小大小。

    【讨论】:

    • 感谢您的回答。您的查询工作正常,但限制有一些问题。我的查询正确地限制了 10 个节点,但是当我测试您的查询时,它只显示 8 个节点。我认为限制子句不仅计算节点,还计算关系。您知道如何仅对节点数应用限制子句吗?
    • 如果我明白你想要什么,我更新的答案应该可以工作。
    • 感谢您的友好解释。现在,通过您的解释,我比以前更好地理解了 limit / order by 条款。我会试试看。非常感谢!
    • 由于您的查询,它正确限制了端节点,但存在排序问题。实际上我想首先在限制值中获得 1 跳内的节点,然后再获得 2 跳节点。例如,如果有 10 个节点 - 距离 1 中的 6 个节点,距离 2 中的 4 个节点,并且限制数量为 8,那么我想先聚合距离 1 中的 6 个节点,然后聚合距离 2 中的 2 个节点。所以由于这个要求,我使用了长度(路径)ASC。你能给我一个处理它的建议吗?
    • 好的,好问题。我再次更新了我的答案,COLLECT 函数似乎弄乱了排序,所以新查询在执行COLLECT 之前不再排序,而是在之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多