Neo4j最大深度和路径

时间:2019-02-25 02:20:59

标签: neo4j cypher

简单的问题是:如何使用neo4j(2.3.11)密码从节点计算最大深度值和最大深度路径?

我的情况的说明

我的节点标签为 person ,关系类型为 supervised

在场景中思考:节点 1 可以监督 2 2 可以监督 3 4 4 可以监督 5 等。

所以有1个需求:

  1. 我想制作一个接收ID的密码,例如1(personID)作为参数,并返回路径[1、2、4、5 ....]

  2. 和另一个返回路径计数的密码。


在第二种情况下,我尝试使用该密码(neo4j 2.3.11),但未成功:

MATCH (person:Person)-[SUPERVISED*]->()
WITH person, LENGTH(SUPERVISED) AS depth
where person.personID = 'la3486551918237738'
RETURN person, depth;

基于this solution

1 个答案:

答案 0 :(得分:1)

您可以在单个查询中获得最大深度和ID列表:

MATCH path=(person:Person)-[:supervised*]->(x)
WHERE person.personID = 'la3486551918237738' AND NOT EXISTS((x)-[:supervised]->())
WITH person, path
ORDER BY LENGTH(path) DESC
LIMIT 1
RETURN person, [n IN NODES(path) | n.personID] AS ids, LENGTH(path) AS depth

注意:

  • 我假设supervised是必需的关系类型。请注意,在[:supervised*]中使用Cypher模式时,冒号必须在关系类型之前。
  • NOT EXISTS((x)-[:supervised]->())测试要求找到的路径以叶节点结尾。
  • ORDER BY LENGTH(path) DESC LIMIT 1选择最长的路径。

[更新]

我在your sample data linked to in the comments中发现了以下问题:

  1. Relations.csv文件的studentID中没有一个在personID中显示为Nodes.csv。 (由于您表示这只是示例中的一个疏忽,因此我将其固定在自己的文件副本中。)
  2. 第一个LOAD CSV查询包含不需要的OPTIONAL MATCH
  3. 第二个LOAD CSV查询需要csvFile.institution属性,但是Relations.csv文件不包含institution标头(它具有university_name标头)。因此,将csvFile.institution替换为csvFile.university_name可修复第二个查询。