与图数据库中的第三个节点具有相同关系的节点

时间:2014-04-21 13:41:59

标签: neo4j

我正在关注Neo4J在线教程,我在使用查询工具尝试此查询时遇到了一个问题:

match (a:Person)-[:ACTED_IN|:DIRECTED]->()<-[:ACTED_IN|:DIRECTED]-(b:Person)
return a,b;

我期待返回的其中一对在两个标识符中具有相同的Person,但这并没有发生。有人可以解释一下为什么吗?匹配子句是否排除使用的不同标识符中的重复元素?

更新: 这个问题来自&#34;第3课 - 与Cypher建立关系,更多&#34;来自Neo4J在线教程,其中提到了我上面提到的查询。 我将查询改进为以下问题,以便更直接地关注我的问题:

MATCH (a:Person {name:"Keanu Reeves"})-[:ACTED_IN]->()<-[:ACTED_IN]-(b)
RETURN a,b;

结果:

|---------------|--------------------|
| a             | b                  |
|---------------|--------------------|
| Keanu Reeves  | Carrie-Anne Moss   |
| Keanu Reeves  | Laurence Fishburne |
| Keanu Reeves  | Hugo Weaving       |
| Keanu Reeves  | Brooke Langton     |
| Keanu Reeves  | Gene Hackman       |
| Keanu Reeves  | Orlando Jones      |
|------------------------------------|

那么,为什么在a和b中没有基努·里维斯的排?他不应该同时兼顾两种关系:ACTED_IN?

2 个答案:

答案 0 :(得分:1)

您观察到的行为是设计的。

引用the manual

  

在模式匹配时,Cypher确保不包括匹配位置   在单个中多次找到相同的图形关系   图案。在大多数用例中,这是一件明智的事情。

答案 1 :(得分:0)

我会检查你的数据样本。您的查询看起来对我来说效果很好。我复制了一个简单的数据集,这里验证它确实产生了你想要的对。

Joe在“Some Flick”中表演了

neo4j-sh (?)$ create (p:Person {name:"Joe"})-[:ACTED_IN]->(m:Movie {name:"Some Flick"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 2
Relationships created: 1
Properties set: 2
Labels added: 2
14 ms

但乔是如此多才多艺,他还执导了“Some Flick”。

neo4j-sh (?)$ match (p:Person {name: "Joe"}), (m:Movie {name: "Some Flick"}) create p-[:DIRECTED]->m;
+-------------------+
| No data returned. |
+-------------------+
Relationships created: 2
23 ms

那么我们所知道的演员/导演是谁?

neo4j-sh (?)$ match (a:Person)-[:ACTED_IN|:DIRECTED]->()<-[:ACTED_IN|:DIRECTED]-(b:Person)
> return a,b;
+-----------------------------------------------------+
| a                        | b                        |
+-----------------------------------------------------+
| Node[222128]{name:"Joe"} | Node[222128]{name:"Joe"} |
| Node[222128]{name:"Joe"} | Node[222128]{name:"Joe"} |
+-----------------------------------------------------+
2 rows
50 ms

当然是乔。