【问题标题】:Neo4j - creating relationships for referential integrityNeo4j - 为参照完整性创建关系
【发布时间】:2020-05-28 01:59:19
【问题描述】:

我已经摄取了所有表和列的元数据,现在我正在尝试使用参照完整性创建关系。我有一个包含 6 列的 csv 文件,即 table_schema、table_name、col_name、referenced_table_schema、referenced_table_name 和 referenced_column_name。现在我只需要在可用的现有列节点之间创建关系。我尝试过的密码查询

LOAD CSV WITH HEADERS FROM "file:///column_ref_integrity.csv" AS csv
 MATCH (n:column), (m:table), (o:db)
 where n.col_name=csv.col_name and m.table_name =csv.table_name and o.db_name = csv.table_schema
where n.col_name=csv.referenced_column_name and m.table_name = csv.referenced_table_name and o.db_name=referenced.db_name
 MERGE  (n{col_name:csv.col_name})-[:refers]->(n{col_name:csv.referenced_column_name}) 

此查询似乎不起作用。关于我做错了什么的任何指示?

【问题讨论】:

  • 您遇到的错误是什么?您的查询中有 2 个连续的 WHERE 子句不受支持。
  • 也删除了连续的 where 子句并尝试了相同的方法。它正在创建具有两者之间关系的新节点,而不是使用现有节点。当我尝试不同版本时,它根本没有建立任何关系。我只是想知道,通常会怎么做?

标签: csv neo4j cypher


【解决方案1】:

这可能对你有用:

LOAD CSV WITH HEADERS FROM "file:///column_ref_integrity.csv" AS row
MATCH (c1:column), (c2:column)
WHERE c1.col_name = row.col_name AND c2.col_name = row.referenced_column_name
MERGE (c1)-[:refers]->(c2) 
WITH row
MATCH (t1:table), (t2:table)
WHERE t1.table_name = row.table_name AND t2.table_name = row.referenced_table_name
MERGE (t1)-[:refers]->(t2) 
WITH row
MATCH (d1:db), (d2:db)
WHERE d1.db_name = row.table_schema AND d2.db_name = row.referenced_table_schema
MERGE (d1)-[:refers]->(d2)

【讨论】:

  • LOAD CSV WITH HEADERS FROM "file:///column_ref_integrity.csv" AS row MATCH (c1:column), (c2:column), (t1:table), (t2:table), (d1:db), (d2:db) WHERE c1.col_name = row.col_name AND c2.col_name = row.referenced_column_name AND t1.table_name = row.table_name AND t2.table_name = row.referenced_table_name AND d1.db_name = row.table_schema AND d2.db_name = row.referenced_table_schema MERGE (c1)-[:refers]->(c2) 我稍微修改了查询以适应我的情况。虽然它创建了关系,但它创建了两个相互引用的关系。
  • 除了 column->referenced_column 之外,还创建了另一个与 referenced_column->column 的关系
  • 您的 CSV 文件可能有 2 行导致该问题。 Cypher 代码非常简单,不会自行导致双向关系。 (另外,如果你只关心column 节点,你为什么还要费心得到table 和db 节点呢?在这种情况下,你只需要像我答案的前4行这样的东西。)跨度>
  • 只有列匹配往往会与来自不同模式的其他列创建关系,因此必须匹配 db_name、table_name 和 column_name 以创建唯一关系,并且 csv 文件只有两行具有两个唯一列匹配。所以把我的头绕了一点
  • 上述查询仍然倾向于与来自不同表但相同模式的列名创建关系。知道那个查询有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多