【问题标题】:How to count distance/hops/length (# relationships) between nodes using cypher?如何使用密码计算节点之间的距离/跳数/长度(# 关系)?
【发布时间】:2020-03-05 20:23:13
【问题描述】:

我正在尝试确定图中节点之间的“距离”。使用示例电影数据库,我想返回距离 Kevin Bacon 较远的演员节点。使用下面的图片来有效地寻找我正在寻找的东西。

如何将其构建到我的密码查询中?这似乎是可能的,我只是想不出办法,因为我的 cypher-foo 还不是很先进:(

MATCH p=(bacon:Person {name:"Kevin Bacon"})-[*1..5]-(hollywood)
WHERE hollywood.name in (['Helen Hunt', 'Ed Harris'])
RETURN p

仅供参考 - 我的 neo4j 数据库是 v4.0

【问题讨论】:

  • 您的查询仅查找 Kevin Bacon 与 Helen Hunt 或 Ed Harris 之间最多 5 步的路径,因此您的可视化不会显示给定的“所有参与者节点”凯文培根的“距离”。你能澄清一下你的实际用例是什么吗?此外,通常单个路径步骤被认为是 1 的“距离”。您似乎对“距离”有不同的定义,可能难以计算(或者其值可能非常模糊)——因为节点可以有任何它们之间的各种类型关系的数量,并且同一节点可能在同一路径中出现多次。
  • @cybersam - 是的,我在 qry 中将其限制为 5 个步骤,只是为了简化图像。我更新了图像以更清楚地显示我的需求和距离的更基本定义。将距离定义为特定锚节点 (Kevin Bacon) 与图中每个其他节点之间的关系数。对于 ALL 节点,我实际上并不需要它,只需要我的密码查询中的节点,因此对于示例查询,只需添加一个附加的“距离”属性,如上所述。这有意义吗?

标签: neo4j cypher graph-databases


【解决方案1】:

这个查询:

MATCH p=(bacon:Person {name:"Kevin Bacon"})-[*1..5]-(hollywood)
WHERE hollywood.name IN ['Helen Hunt', 'Ed Harris']
UNWIND
  REDUCE(s = [], i IN RANGE(0, LENGTH(p)) |
    s + {dist: i, node: NODES(p)[i]}
  ) AS data
RETURN data.dist AS distance, COLLECT(DISTINCT data.node) AS nodes

返回这个结果:

╒══════════╤═════════════════════════════════════════════════════════════════════╕
│"distance"│"nodes"                                                              │
╞══════════╪═════════════════════════════════════════════════════════════════════╡
│0         │[{"name":"Kevin Bacon","born":1958}]                                 │
├──────────┼─────────────────────────────────────────────────────────────────────┤
│1         │[{"title":"Apollo 13","tagline":"Houston, we have a problem.","releas│
│          │ed":1995},{"title":"A Few Good Men","tagline":"In the heart of the na│
│          │tion's capital, in a courthouse of the U.S. government, one man will │
│          │stop at nothing to keep his honor, and one will stop at nothing to fi│
│          │nd the truth.","released":1992},{"title":"Frost/Nixon","tagline":"400│
│          │ million people were waiting for the truth.","released":2008}]       │
├──────────┼─────────────────────────────────────────────────────────────────────┤
│2         │[{"name":"Tom Hanks","born":1956},{"name":"Ed Harris","born":1950},{"│
│          │name":"Bill Paxton","born":1955},{"name":"Cuba Gooding Jr.","born":19│
│          │68},{"name":"Jack Nicholson","born":1937},{"name":"Ron Howard","born"│
│          │:1954}]                                                              │
├──────────┼─────────────────────────────────────────────────────────────────────┤
│3         │[{"title":"Cast Away","tagline":"At the edge of the world, his journe│
│          │y begins.","released":2000},{"title":"Twister","tagline":"Don't Breat│
│          │he. Don't Look Back.","released":1996},{"title":"As Good as It Gets",│
│          │"tagline":"A comedy from the heart that goes for the throat.","releas│
│          │ed":1997},{"title":"Apollo 13","tagline":"Houston, we have a problem.│
│          │","released":1995}]                                                  │
├──────────┼─────────────────────────────────────────────────────────────────────┤
│4         │[{"name":"Helen Hunt","born":1963},{"name":"Ed Harris","born":1950}] │
└──────────┴─────────────────────────────────────────────────────────────────────┘

请注意,电影“Apollo 13”出现在结果中的距离为 1 和 3。而“Ed Harris”出现在距离为 2 和 4。这是因为从“凯文培根”到这两个节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 2017-07-29
    • 2014-11-29
    • 1970-01-01
    • 2012-10-13
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多