最长路径Neo4j返回错误路径

时间:2019-01-06 21:27:40

标签: neo4j cypher

我以csv格式存储了以下图形:

graphUnioned.csv:
a b
b c

上图表示从Node:a到Node:b的路径。请注意,文件中的第一列表示源,第二列表示目标。使用此逻辑,图中的第二条路径是从Node:b到Node:c。图中最长的路径是:Node:a到Node:b到Node:c。

我使用以下命令在Neo4j桌面中加载了上述csv:

LOAD CSV WITH HEADERS FROM "file:\\graphUnioned.csv" AS csvLine 
MERGE (s:s {s:csvLine.s}) 
MERGE (o:o {o:csvLine.o}) 
MERGE (s)-[]->(o) 
RETURN *;

然后为了找到最长的路径,我运行以下命令:

match (n:s)
where (n:s)-[]->() 
match p = (n:s)-[*1..]->(m:o)
return p, length(p) as L
order by L desc
limit 1;

但是不幸的是,该命令仅给我从Node:a到Node:b的路径,而没有返回最长路径。有人可以帮我了解我要去哪里哪里吗?

1 个答案:

答案 0 :(得分:0)

CSV导入查询中有两个错误。

首先,当您合并节点之间的关系时,需要使用一种类型,否则该查询将无法编译。您可能提供了一个,但在此处粘贴时忘了添加。

第二个大问题是,您的查询正在合并具有不同标签和不同属性的节点,这主要是将其丢弃。您的意图是创建3个节点,并用最长的路径连接它们,但您的查询将创建4个节点,两个节点组成两个孤立的组:

这将创建2个b节点:(:s {s:b})(:o {o:b})。它们中的每一个都连接到不同的节点,这是由于对从CSV中每个变量创建的节点的处理方式不同。

您应该做的是对所有涉及的节点使用相同的标签和属性键,这将使与b节点的匹配仅引用单个节点,而不创建两个节点:

LOAD CSV WITH HEADERS FROM "file:\\graphUnioned.csv" AS csvLine 
MERGE (s:Node {value:csvLine.s}) 
MERGE (o:Node {value:csvLine.o}) 
MERGE (s)-[:REL]->(o) 
RETURN *;

您还需要在:Node(value)(或导入实数据时的等效值)上建立索引,以便在按属性执行节点查找时,您的MERGE和后续的MATCH很快。

现在,进入最长路径查询。

如果您假设起始节点与其没有关系,并且您的末端节点与它没有关系,则可以使用如下查询:

match (start:Node)
where not ()-->(start) 
match p = (start)-[*]->(end)
where not (end)-->()
return p, length(p) as L
order by L desc
limit 1;