我是Neo4j的新手,我正在使用示例提供的数据库(Link)。 我试图在每个扮演同一部电影的演员之间创建一个新的关系,然后我运行这个查询
MATCH (p1:Actor)-[:ACTS_IN]->(:Movie)<-[:ACTS_IN]-(p2:Actor)
WHERE id(p1)>id(p2)
MERGE (p1)-[:ACTED_WITH]->(p2)
但由于一个未知的原因,它只创造了一些关系而不是其他关系。我已经检查了Node类型和Relationships类型,但似乎它们都是相同的,因此查询应该在所有情况下都能正确运行。
如果你想尝试这个东西,只需从链接下载数据库,运行上面的查询,并检查这两部电影,阿凡达的作品但不适用于哈特的战争
MATCH p=(a)-[]-()
WHERE a.title = "Hart's War" OR a.title="Avatar"
RETURN p
答案 0 :(得分:0)
此查询应该满足您的需求:
MATCH (p1:Actor)-[:ACTS_IN]->(m:Movie)
MATCH (p2:Actor)-[:ACTS_IN]->(m)
WHERE p2 <> p1
OPTIONAL MATCH (p1)-[r:ACTED_WITH]-(p2)
FOREACH (n IN (CASE WHEN r IS NULL THEN [0] ELSE [] END) |
MERGE (p1)-[:ACTED_WITH]->(p2)
)
我不知道这种做法是否最好,但我相信这是有效的。
要仅在两个节点之间创建:ACTED_WITH
关系(而不是(a)-[:ACTED_WHT]->(b)
和(a)<-[:ACTED_WHT]-(b)
)我正在使用this trick。 Basicaly我正在使用IF
和FOREACH
语句模拟CASE
条件。
使用Neo4j 3.2测试。