Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 作为变量的关系类型_Neo4j_Cypher - Fatal编程技术网

Neo4j 作为变量的关系类型

Neo4j 作为变量的关系类型,neo4j,cypher,Neo4j,Cypher,我希望关系标签是“xxxyy”节点的组合, 甚至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 这在普通密码中是不可能的,但您可以使用以下过程来完成: MATC

我希望关系标签是“xxxyy”节点的组合, 甚至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

这在普通密码中是不可能的,但您可以使用以下过程来完成:

MATCH (a:book),(b:story) 
WHERE a.Name = "xxx" AND b.Name = "yyy" 
CALL apoc.create.relationship(a, a.name + b.name, {}, b)

这在普通密码中是不可能的,但您可以使用以下过程来完成:

MATCH (a:book),(b:story) 
WHERE a.Name = "xxx" AND b.Name = "yyy" 
CALL apoc.create.relationship(a, a.name + b.name, {}, b)

假设有
s
故事名,平均每个故事都有
B
书名。这将为您提供
S*B
关系类型。创建这么多关系类型不是一种好的做法,尤其是当类型名称包含实际数据值时。事实上,对你想做的事情缺乏密码支持表明这是一种不好的做法

关系类型名称应该表示一种“关系类型”——并且不要过于精细,以至于表示“特定的个人关系”。相反,要查找特定关系,应使用其类型名称及其属性值和/或所连接节点的属性值

下面是一些您可能想做的示例

创建一个
包含一本书和一个故事之间的
关系(为了获得更好的性能,您还应该在
:book(Name)
:story(Name)
)上创建:

要获取包含特定故事的所有书籍,请执行以下操作:

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 s.Name = "yyy"
RETURN b, s;

假设有
s
故事名,平均每个故事都有
B
书名。这将为您提供
S*B
关系类型。创建这么多关系类型不是一种好的做法,尤其是当类型名称包含实际数据值时。事实上,对你想做的事情缺乏密码支持表明这是一种不好的做法

关系类型名称应该表示一种“关系类型”——并且不要过于精细,以至于表示“特定的个人关系”。相反,要查找特定关系,应使用其类型名称及其属性值和/或所连接节点的属性值

下面是一些您可能想做的示例

创建一个
包含一本书和一个故事之间的
关系(为了获得更好的性能,您还应该在
:book(Name)
:story(Name)
)上创建:

要获取包含特定故事的所有书籍,请执行以下操作:

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 s.Name = "yyy"
RETURN b, s;

与仅使用常量关系类型(如CONTAINS)相比,这样做的好处是什么?我有大量节点,希望关系名称是两个连接节点的串联,这似乎是识别它们的最简单方法,我可以剪切和粘贴相同的节点,只需更改节点的2个变量名称。我不知道contains是如何做到这一点的。您可以使用
匹配(a:book{name:'xxx'})-[:contains]->(b:story{name:'yyy'})
来查找示例中两本书之间的路径。您尝试的不是“自然”的数据建模方式,可能效率很低,这取决于您的代码外观。与仅使用常量关系类型(如CONTAINS)相比,这样做有什么好处?我有大量的节点,希望关系名称是两个连接节点的串联,似乎是识别它们的最简单方法,我可以剪切和粘贴相同的名称,只需更改节点的两个变量名称。我不知道contains是如何做到这一点的。您可以使用
匹配(a:book{name:'xxx'})-[:contains]->(b:story{name:'yyy'})
来查找示例中两本书之间的路径。您试图做的不是“自然”的数据建模方式,可能效率很低,这取决于您的代码外观。“您想做的事情缺乏密码支持,这表明这是一种不好的做法。”同意,这就是为什么问题和答案如此有价值的原因。图形模型中的解决方案和最佳方法不同于编程语言中的模式匹配。Neo4j建模的灵活性是其优势之一,这意味着这样的建模更改是一种完全有效的、非破坏性的(可能是最好的)解决方案。“对您想要做的事情缺乏密码支持表明这是一种不好的做法。”同意,这就是为什么问题和您的答案如此有价值的原因。图形模型中的解决方案和最佳方法不同于编程语言中的模式匹配。Neo4j建模的灵活性是其优势之一,这意味着像这样的建模更改是一个完全有效的、非破坏性的(可能是最好的)解决方案。