Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用变量匹配标签动态创建Neo4j/Cypher关系_Neo4j - Fatal编程技术网

使用变量匹配标签动态创建Neo4j/Cypher关系

使用变量匹配标签动态创建Neo4j/Cypher关系,neo4j,Neo4j,我需要在现有节点之间创建关系,并且已经尝试过跟随youtube创建动态节点和关系:有几次,但我认为它们没有涵盖我的用例 示例数据: SOURCE TARGET LABEL TYPE SOURCE_TYPE TARGET_TYPE SOURCE_KEY TARGET_KEY PHLEVEL COLOR SIZE SCOPE 16 1 ERKRS_ROOT DIRECTED ERKRS ROOT ERKRS_R300 ROOT_EC3_8

我需要在现有节点之间创建关系,并且已经尝试过跟随youtube创建动态节点和关系:有几次,但我认为它们没有涵盖我的用例

示例数据:

SOURCE  TARGET  LABEL   TYPE    SOURCE_TYPE TARGET_TYPE SOURCE_KEY  TARGET_KEY  PHLEVEL COLOR   SIZE    SCOPE
16      1   ERKRS_ROOT  DIRECTED    ERKRS   ROOT    ERKRS_R300  ROOT_EC3_800    0       #808080 1   FALSE
12      1   ERKRS_ROOT  DIRECTED    ERKRS   ROOT    ERKRS_INT1  ROOT_EC3_800    0       #808080 1   FALSE
51      1   KKBER_ROOT  DIRECTED    KKBER   ROOT    KKBER_GVK1  ROOT_EC3_800    0       #808080 1   FALSE
31      1   KKBER_ROOT  DIRECTED    KKBER   ROOT    KKBER_6000  ROOT_EC3_800    0       #808080 1   FALSE
71      1   FIKRS_ROOT  DIRECTED    FIKRS   ROOT    FIKRS_1000  ROOT_EC3_800    0       #808080 1   FALSE
334     9   KOKRS_ERKRS DIRECTED    KOKRS   ERKRS   KOKRS_2000  ERKRS_IDEA      1       #808080 1   FALSE
335     9   KOKRS_ERKRS DIRECTED    KOKRS   ERKRS   KOKRS_2200  ERKRS_IDEA      1       #808080 1   FALSE
342     9   KOKRS_ERKRS DIRECTED    KOKRS   ERKRS   KOKRS_4500  ERKRS_IDEA      1       #808080 1   FALSE
我已使用apoc.create.node和我的节点文件成功地动态创建了节点。节点标签=源类型或目标类型。节点密钥属性=源密钥或目标密钥。关系是标签列

现在我面临创建关系的挑战,因为MATCH子句不接受来自我的文件的标签-这是我的脚本:

USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS  FROM 'file:///IDES__Edges1.csv' AS line
MATCH (x:line.SOURCE_TYPE {key:line.SOURCE_KEY}), (y:line.TARGET_TYPE {key:line.TARGET_KEY})
CALL apoc.create.relationship(x, line.LABEL, y) YIELD rel RETURN count(*)
我得到这个错误

    Neo.ClientError.Statement.SyntaxError: Invalid input '.': expected an identifier character, whitespace, NodeLabel, a property map, ')' or a relationship pattern (line 2, column 15 (offset: 103))
"   MATCH (x:line.SOURCE_TYPE {key:line.SOURCE_KEY}), (y:line.TARGET_TYPE {key:line.TARGET_KEY})"

有人对如何处理这个问题有什么想法吗?我马上就要解决我的问题了!谢谢你的帮助。John

这说明了为什么建议按节点类型处理单个CSV文件,以便您始终能够知道要硬编码到查询中的标签

这是Cypher的一个要求,因为当标签被硬编码时,规划者需要利用数据库中的元数据来帮助如何有效地规划查询执行(动态标签的评估必须在执行期间进行……这对必须在执行前规划查询的规划者是无用的)

对于这种情况,最好向添加的每种类型的所有节点添加第二个更通用的标签,然后使用
key
属性和该通用标签创建索引,并在创建关系时使用该通用标签进行查找

因此,在应用了常规标签(现在我们只称其为:Node)并在:Node(key)上创建了索引之后,它就简单到:

USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS  FROM 'file:///IDES__Edges1.csv' AS line
MATCH (x:Node {key:line.SOURCE_KEY}), (y:Node {key:line.TARGET_KEY})
CALL apoc.create.relationship(x, line.LABEL, y) YIELD rel 
RETURN count(*)

当然,这假设键在具有所有给定标签的所有节点中是唯一的。如果不是这样,则需要另一种方法。

谢谢您!我是Neo4j新手,但我想我理解你的回答。幸运的是,我已经有了一个“全局”标签(“EOI”),并且我的键是唯一的,所以我所要做的就是“在:EOI(键)上创建索引”。我还需要在apoc.create.relationship参数中添加一个{}。否则,它就成功了!我有一点意见——我正在用10^^4种对象和10^^9个对象实例对一个系统进行建模。因此,每种类型的单个文件的想法是不可能的。再次感谢。约翰站着。拥有共同的标签仍然是这里的关键。要在匹配后动态添加标签,可以使用