2017-06-13 91 views
0

我是Neo4j的新手,我正在使用示例提供的数据库(Link)。 我试图在每个演员之间创建一个新的relatiohip,我运行此查询Neo4j Cypher没有履行查询

MATCH (p1:Actor)-[:ACTS_IN]->(:Movie)<-[:ACTS_IN]-(p2:Actor) WHERE id(p1)>id(p2) MERGE (p1)-[:ACTED_WITH]->(p2)

但由于未知原因,它创建只是一些关系,而不是其他。我检查了两个节点类型和关系类型,但似乎他们都是一样的,所以查询应在所有情况下正确运行。

如果您想要RY这个东西刚刚从链接下载数据库,运行上面的查询,并检查了这两部电影,阿凡达的作品,但不是哈特的战争

MATCH p=(a)-[]-() WHERE a.title = "Hart's War" OR a.title="Avatar" RETURN p

+0

不幸的数据库尚未更新用的Neo4j的更高版本的工作,你必须迁移数据,虽然我不知道这解释了你所看到的行为,然而。您是否尝试过使用':play movies'使用内置电影数据库? – InverseFalcon

+0

@InverseFalcon您只需将'dbms.allow_format_migration = true'添加到neo4j的配置文件中,他就会为您迁移格式! – user3351109

+0

尝试与你链接的分贝,你的查询工作得很好,所有的coactors似乎连接正确。您使用的是哪个版本的Neo4j,并且在图表结果中是否有自动完成的功能? – InverseFalcon

回答

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。基本我正在使用FOREACHCASE陈述模拟IF条件。

用Neo4j测试3.2。

Output

+0

我试过运行您的查询,结果与我的相同,但它也会创建反向链接('(a) - [:ACTED_WHT] - >(b)和( a)< - [:ACTED_WHT] - (b)') 我的问题是,它不是沿着所有图形创建的,而只是它的一个子集 – user3351109

+0

奇怪。在这里使用Neo4j 3.2和Movie Database Dataset。我用打印屏幕更新了我的答案。请注意,我修改了关系类型和标签。 –

+0

只需再次下载数据集,只运行您的查询。 Clint Eastwood和Richard Harris唯一能找到的电影是“Unforgiven”,这是它在我的电脑上显示的截图。 http://imgur.com/a/6U0ht – user3351109