在节点类型a之间创建一个关系到两个其他节点类型neo4j中的任何一个

时间:2017-09-21 23:08:56

标签: neo4j cypher graph-databases

目标是在一个查询中将两个不同的节点类型指向关系。应该可行......

MATCH (a:person), (b:fruit|b:vegetable)
WHERE a.favorite_food = b.name
CREATE (a)-[r:likes]->(b)

这是id认为它会是什么样子,但似乎不起作用?

谢谢!

4 个答案:

答案 0 :(得分:1)

我不知道我是否完全理解你的问题。

如果您希望fruit与具有vegetable OR MATCH (a:person), (b) WHERE ANY(x IN ['fruit', 'vegetable'] WHERE x IN labels(b)) AND a.favorite_food = b.name CREATE (a)-[r:likes]->(b) 标签的节点匹配,则可以将labels()功能与{一起使用} {3}}

(b)

如果您希望fruit与具有vegetable XOR any()标签的节点匹配(即:这两个标签之间只有一个),从(b)更改为ANY

但是,如果您希望fruit与具有vegetable AND MATCH (a:person), (b:fruit:vegetable) WHERE a.favorite_food = b.name CREATE (a)-[r:likes]->(b) 标签的节点匹配,则可以在匹配时在同一变量中指定两个标签,像这样:

didSelect

答案 1 :(得分:0)

如果我了解您要实现的目标,最简单的解决方案是为所有水果和蔬菜节点添加额外的食品标签。然后你有办法用一个标签来解决这两个问题,(b:食物)。

如果您不想这样做,可以使用LABELS()函数检查每个节点上是否存在特定标签。但正如其他人所提到的,这将需要扫描数据库中的所有节点。

另一个解决方案是按顺序执行检查,但在移动到下一个之前使用聚合函数向下折叠查询管道(以避免笛卡尔积或必须收集不同的节点。

答案 2 :(得分:-1)

您需要一个迁移脚本,以根据现有节点的属性添加Neo4j关系。我建议使用您选择的语言在代码中编写迁移脚本,该代码通过适当的驱动程序调用您的Neo4j DB。

答案 3 :(得分:-1)

除了Brunos answer,您还可以使用

MATCH (a:Person) 
OPTIONAL MATCH (f:fruit), (v:vegetable) 
WITH m, COLLECT(DISTINCT f)+COLLECT(DISTINCT v) as list
UNWIND list as b
CREATE UNIQUE (a)-[r:likes]->(b)

MATCH (a:Person) 
OPTIONAL MATCH (f:fruit)
CREATE UNIQUE (a)-[r:likes]->(f)
WITH a
OPTIONAL MATCH (v:vegetable)
CREATE UNIQUE (a)-[r:likes]->(v)

根据您的数据库,这可能更高效,因为它不需要全节点扫描。