我对Neo4j很新,现在已经玩了几天了。
我试图通过展示一个表如何与另一个表相关(数据被拉到或从一个表推送到另一个表)以及用于执行哪些脚本来使用Neo4j来映射我们公司的数据库这种拉动和推动。为此,我使用了三个不同的属性:TableName,ScriptName和TableTouch。
以下是.CSV I导入的示例:
TableName ScriptName TableTouch
Source ScriptA Water/Oil
Water ScriptB Source
Oil ScriptC Source
这是我到目前为止的代码:
CREATE CONSTRAINT ON (c:Table) ASSERT c.TableName IS UNIQUE;
CREATE CONSTRAINT ON (c:Scripts) ASSERT c.ScriptName IS UNIQUE;
LOAD CSV WITH HEADERS FROM
"file:///C:\\NeoTest.CSV" AS line
MERGE (table:Table {TableName: UPPER(line.TableName)})
SET table.TableTouch = UPPER(line.TableTouch)
MERGE (script:Scripts {ScriptName: UPPER(line.ScriptName)})
MERGE (table) - [:UPDATED_BY] -> (script)
这会将脚本与其相应的表相关联,并加载到所有表和脚本节点中。
现在我需要的一个例子是Node" Source"连接Node" Water"因为"来源" = Water.TableTouch和" Water" = Source.TableTouch。
假设任何给定的表可以在TableTouch属性中列出多个表。
我希望TableName节点连接到其他TableName节点,其中在另一个节点的TableName.TableTouch中找到一个节点的TableName。我该怎么做呢?我是否需要以不同的方式格式化我的.CSV格式?
谢谢, -Andrew
编辑:这可能会使事情变得更加清晰
我有什么:
答案 0 :(得分:1)
[增订]
如果我了解您的方案,您希望表示用于生成每个表的脚本,以及该脚本使用的其他表。
而且,如果我理解了CSV文件和图片的含义,Source
表似乎是由ScriptA
生成的,而不使用任何其他表中的数据。如果是这样,您可以创建CSV文件,使其看起来像这样(Source
表格行的TableTouch
列具有特殊值NOTHING
- 您可以使用其他名称 - 来表明该列实际上没有值):
TableName,ScriptName,TableTouch
Source,ScriptA,NOTHING
Water,ScriptB,Source
Oil,ScriptC,Source
(src:Table {name: 'Source'})<-[:USES]-(s:Script {name: 'ScriptC'})-[:MAKES]->(dest:Table {name: 'Oil'})
注意:此数据模型允许单个脚本“使用”任意数量的源表并“生成”任意数量的目标表。
CREATE CONSTRAINT ON (t:Table) ASSERT t.name IS UNIQUE;
CREATE CONSTRAINT ON (s:Script) ASSERT s.name IS UNIQUE;
LOAD CSV WITH HEADERS FROM "file:///C:\\NeoTest.CSV" AS line
MERGE (src:Table {name: line.TableTouch})
MERGE (dest:Table {name: line.TableName})
MERGE (script:Script {name: line.ScriptName})
MERGE (script)-[:USES]->(src)
MERGE (script)-[:MAKES]->(dest)
注意:为了简化查询,我们继续创建(最多)一个NOTHING
节点来表示缺少源表。