我希望关系标签是" xxxyyy"节点的组合, 甚至是xxx_yyy," +"是字符串连接或将变量设置为x = a.name + b.name但我尝试或查找的内容失败。
关系标签中没有引号或美元符号,可以为我节省很多打字。
MATCH (a:book),(b:story)
WHERE a.Name = "xxx" AND b.Name = "yyy"
CREATE (a)-[r:a.name+b.name]->(b)
RETURN r
答案 0 :(得分:1)
普通Cypher无法做到这一点,但您可以使用apoc.create.relationship
程序来完成此任务:
MATCH (a:book),(b:story)
WHERE a.Name = "xxx" AND b.Name = "yyy"
CALL apoc.create.relationship(a, a.name + b.name, {}, b)
答案 1 :(得分:0)
我们说有S
个故事名称,平均每个故事都有B
个书名。这会给你S * B
关系类型。创建那么多关系类型并不是一个好习惯,特别是当类型名称包含实际数据值时。事实上,Cypher缺乏对你想要做的事情的支持,这表明这是一种不好的做法。
关系类型名称应该表示"关系类型" - 并不是那么精细,以表示特定的个人关系"。相反,要查找特定关系,您应该使用其类型名称,以及它所连接的节点的属性值和/或属性值。
以下是您可能想要做的一些示例。
在图书和故事之间建立CONTAINS
关系(为了获得更好的效果,您还应该在:book(Name)
和:story(Name)
上创建indexes)):
MATCH (b:book),(s:story)
WHERE b.Name = "xxx" AND s.Name = "yyy"
CREATE (b)-[r:CONTAINS]->(s)
RETURN r;
获取包含特定故事的所有书籍:
MATCH (b:book)-[:CONTAINS]->(s:story)
WHERE s.Name = "yyy"
RETURN b;
获取特定书籍中包含的所有故事:
MATCH (b:book)-[:CONTAINS]->(s:story)
WHERE b.Name = "xxx"
RETURN s;
要验证特定图书是否包含特定故事,请获取它们:
MATCH (b:book)-[:CONTAINS]->(s:story)
WHERE b.Name = "xxx" AND AND s.Name = "yyy"
RETURN b, s;