在Neo4j上加载稀疏邻接矩阵

在Neo4j上加载稀疏邻接矩阵,neo4j,cypher,Neo4j,Cypher,我试图在Neo4j中加载一个稀疏(共现)矩阵,但在多次失败的查询之后,它变得令人沮丧 基本上,我想从ids创建节点,相互之间的关系权重(包括自身)应该是矩阵上的值 因此,例如,“nhs”应该与体重41和16的“英格兰”有自我关系,等等 我尝试过这样的事情: LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row MERGE (a: node{name: row.id}) MERGE (b: node{name: row.key}) M

我试图在Neo4j中加载一个稀疏(共现)矩阵,但在多次失败的查询之后,它变得令人沮丧

基本上,我想从ids创建节点,相互之间的关系权重(包括自身)应该是矩阵上的值

因此,例如,“nhs”应该与体重41和16的“英格兰”有自我关系,等等

我尝试过这样的事情:

LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (a: node{name: row.id})
MERGE (b: node{name: row.key})
MERGE (a)-[:w]-(b);
但我不确定如何附加边值(也不确定合并是否产生了预期的结果)


提前感谢您的帮助

如果您只需要在CSV中包含属性值的关系上添加属性,那么只需为合并的关系添加变量,然后使用SET即可(或者在“创建集”上,如果您只想在关系不存在且需要创建时设置属性),则类似于:

LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (a: node{name: row.id})
MERGE (b: node{name: row.key})
MERGE (a)-[r:w]-(b)
SET r.weight = row.weight
LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (start:Node {name:row.id})
WITH start, row, [key in keys(row) WHERE key <> 'id'] as keys
FOREACH (key in keys | 
 MERGE (end:Node {name:key})
 MERGE (start)-[r:w]-(end)
 ON CREATE SET r.weight = row[key] )
编辑

啊,看一下CSV剪辑。这是一种非常奇怪的数据格式。你的标题中有数据(即,你的标题试图定义要查找的另一个节点),这是一种错误的方式。相反,你应该每行有一列定义要连接的两个节点之一(如“id”列)然后是另一个节点的另一列(类似于“id2”)。这样,您只需进行两次匹配即可获得节点,然后在它们之间进行合并,然后设置relationship属性,类似于我上面提供的示例查询

但如果您使用这种格式,那么它将是一个更复杂的查询,因为我们必须处理行键和值的动态访问

比如:

LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (a: node{name: row.id})
MERGE (b: node{name: row.key})
MERGE (a)-[r:w]-(b)
SET r.weight = row.weight
LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (start:Node {name:row.id})
WITH start, row, [key in keys(row) WHERE key <> 'id'] as keys
FOREACH (key in keys | 
 MERGE (end:Node {name:key})
 MERGE (start)-[r:w]-(end)
 ON CREATE SET r.weight = row[key] )
从加载带有标题的CSV'file:///matpharma.csv“作为一排
合并(开始:节点{name:row.id})
以开始、行、[输入键(行),其中键“id”]作为键
FOREACH(键入键|
合并(结束:节点{name:key})
合并(开始)-[r:w]-(结束)
在创建集合时r.weight=行[键])

如果您只需要在CSV中包含属性值的关系上添加属性,那么只需为合并的关系添加变量,然后使用SET(或者在创建集上,如果您只想在关系不存在且需要创建时设置属性)。例如:

LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (a: node{name: row.id})
MERGE (b: node{name: row.key})
MERGE (a)-[r:w]-(b)
SET r.weight = row.weight
LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (start:Node {name:row.id})
WITH start, row, [key in keys(row) WHERE key <> 'id'] as keys
FOREACH (key in keys | 
 MERGE (end:Node {name:key})
 MERGE (start)-[r:w]-(end)
 ON CREATE SET r.weight = row[key] )
编辑

啊,看一下CSV剪辑。这是一种非常奇怪的数据格式。你的标题中有数据(即,你的标题试图定义要查找的另一个节点),这是一种错误的方式。相反,你应该每行有一列定义要连接的两个节点之一(如“id”列)然后是另一个节点的另一列(类似于“id2”)。这样,您只需进行两次匹配即可获得节点,然后在它们之间进行合并,然后设置relationship属性,类似于我上面提供的示例查询

但如果您使用这种格式,那么它将是一个更复杂的查询,因为我们必须处理行键和值的动态访问

比如:

LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (a: node{name: row.id})
MERGE (b: node{name: row.key})
MERGE (a)-[r:w]-(b)
SET r.weight = row.weight
LOAD CSV WITH HEADERS FROM 'file:///matpharma.csv' AS row
MERGE (start:Node {name:row.id})
WITH start, row, [key in keys(row) WHERE key <> 'id'] as keys
FOREACH (key in keys | 
 MERGE (end:Node {name:key})
 MERGE (start)-[r:w]-(end)
 ON CREATE SET r.weight = row[key] )
从加载带有标题的CSV'file:///matpharma.csv“作为一排
合并(开始:节点{name:row.id})
以开始、行、[输入键(行),其中键“id”]作为键
FOREACH(键入键|
合并(结束:节点{name:key})
合并(开始)-[r:w]-(结束)
在创建集合时r.weight=行[键])

这是一个很好的密码挑战:)让我们假设加载CSV并不是真的要这么做,也许你会更高兴地将数据展平

以下是我的想法:

LOAD CSV FROM "https://gist.githubusercontent.com/ikwattro/a5260d131f25bcce97c945cb97bc0bee/raw/4ce2b3421ad80ca946329a0be8a6e79ca025f253/data.csv" AS row
WITH collect(row) AS rows
WITH rows, rows[0] AS firstRow
UNWIND rows AS row
WITH firstRow, row SKIP 1
UNWIND range(0, size(row)-2) AS i
RETURN firstRow[i+1], row[0], row[i+1]

你可以看一下要点

这是一个很好的密码挑战:)假设加载CSV并不是真的要这么做,也许你会更高兴地将数据平坦化

以下是我的想法:

LOAD CSV FROM "https://gist.githubusercontent.com/ikwattro/a5260d131f25bcce97c945cb97bc0bee/raw/4ce2b3421ad80ca946329a0be8a6e79ca025f253/data.csv" AS row
WITH collect(row) AS rows
WITH rows, rows[0] AS firstRow
UNWIND rows AS row
WITH firstRow, row SKIP 1
UNWIND range(0, size(row)-2) AS i
RETURN firstRow[i+1], row[0], row[i+1]

你可以看看要点

它仍然没有奏效。我认为我的合并从一开始就是错误的:看起来关系指向的节点似乎是矩阵中的值,而这个值应该在边缘。@InverseFalcon:非常好的更新。您还可以通过删除
WITH
子句并直接在
FOREACH
中使用列表理解而不是
键来进一步简化!很好的推荐!它仍然没有发挥作用。我认为我的合并从一开始就是错误的:看起来关系指向的节点似乎是矩阵中的值,而这个值应该在边缘。@InverseFalcon:非常好的更新。您还可以通过删除
WITH
子句并直接在
FOREACH
中使用列表理解而不是
键来进一步简化!很好的推荐!