【问题标题】:Neo4J set new property on Relationship by Relationship IDNeo4J 通过关系 ID 在关系上设置新属性
【发布时间】:2020-06-13 19:19:02
【问题描述】:

我有一个 Neo4J 图表,并希望根据已设置的关系的 ID 在关系上添加一个新属性。 ID 是一个属性,如下所示:

id:16_0beta1_1b500480_1221807483755_439038_8369

在一个 CSV 文件中,我存储了 400 个IDs 和一个对应于IDstype。 Neo4J 应该加载 CSV 文件并查看所有关系。当关系 ID 与 CSV 文件中的 ID 匹配时,它应该 set 像这样的新属性:set r.SysML=row.type 并在关系上创建一个新属性:

SysML:块

对于节点,以下子句运行良好:

LOAD CSV WITH HEADERS FROM "file:///SysML.csv" AS row 
merge(n:name {id:row.sysID}) 
on match set n.SysML=row.type

对于我尝试的关系属性:

LOAD CSV WITH HEADERS FROM "file:///SysML.csv" AS row 
merge ()-[r:rel {id:row.sysID}]->() 
on match set r.SysML=row.type

即使关系有很多变化,我也无法解决它......

【问题讨论】:

  • 这个查询是正确的,应该可以工作。您可能在匹配查询中遗漏了某些内容。您能否检查以下查询是否返回任何内容? LOAD CSV WITH HEADERS FROM "file:///SysML.csv" AS row MATCH ()-[r:rel {id:row.sysID}]->() RETURN r LIMIT 10
  • 是的,它返回了所有带有标签“rel”的关系,但是当我进行查询时,它给出了一个错误:Neo4J 不喜欢“匹配集”部分......跨度>
  • 确切的错误信息是什么?

标签: neo4j cypher


【解决方案1】:

你不应该这样做:

merge ()-[r:rel {id:row.sysID}]->()

如果该关系尚不存在,则该子句将在 2 个没有标签或属性的全新节点之间创建一个新关系(并且您的 on match 子句也不会应用)。

由于您的问题表明您只想更新现有rel 关系的SysML 属性,因此您应该使用MATCH 而不是MERGE

LOAD CSV WITH HEADERS FROM "file:///SysML.csv" AS row 
MATCH ()-[r:rel {id: row.sysID}]->() 
SET r.SysML = row.type

顺便说一句,如果您限定端节点(例如,通过提供标签,甚至属性值)以避免扫描数据库中的每个关系,效率会更高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多