目标是在一个查询中将两个不同的节点类型指向关系。应该可行......
MATCH (a:person), (b:fruit|b:vegetable)
WHERE a.favorite_food = b.name
CREATE (a)-[r:likes]->(b)
这是id认为它会是什么样子,但似乎不起作用?
谢谢!
答案 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)
根据您的数据库,这可能更高效,因为它不需要全节点扫描。