我以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的路径,而没有返回最长路径。有人可以帮我了解我要去哪里哪里吗?
答案 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;