neo4j所有关系到2集之间的一定深度

时间:2017-07-25 13:38:38

标签: neo4j cypher

玩简单的neo4j查询。我的基本匹配是:

MATCH (:Movie { id: '10' })-[*0..3]-(p:Producer)
RETURN p.id

这会返回一些结果,所以很明显,movie-10和任何制作人都有一些关系。结果集的一部分是:

'producer_12'
'producer_18'
'producer_36'
.........

现在我想返回movie-10和producer_12或者producer_18之间的所有关系,最多3个跃点。我修改了我的比赛。

MATCH (:Movie { id: '10' })-[*0..3]-(p:Producer)
WHERE p.id IN ['producer_12', 'producer_18']
RETURN p.id

这已经没有任何价值,而我期望生产者12和18能够得到答案。此外,我找不到标记关系的方法。这是不被接受的。 [R:* 0..3]。

我的最终查询必须是获得2组(电影10,12或15)和(制片人12或18)之间的所有关系。

1 个答案:

答案 0 :(得分:1)

我在这里模拟你的场景。

样本数据:

CREATE (movie:Movie {id : '10'})
CREATE (producer12:Producer {id:'producer_12'})
CREATE (producer18:Producer {id:'producer_18'})
CREATE (producer36:Producer {id:'producer_36'})
CREATE (movie)-[:PRODUCTED_BY]->(producer12)
CREATE (movie)-[:PRODUCTED_BY]->(producer18)
CREATE (movie)-[:PRODUCTED_BY]->(producer36)

查询:

MATCH (:Movie { id: '10' })-[*0..3]-(p:Producer)
WHERE p.id IN ['producer_12', 'producer_18']
RETURN p.id

结果:

╒═════════════╕
│"p.id"       │
╞═════════════╡
│"producer_12"│
├─────────────┤
│"producer_18"│
└─────────────┘

id:Movie节点的string属性可能不是integer而是MATCH (:Movie { id: 10 })-[*0..3]-(p:Producer) WHERE p.id IN ['producer_12', 'producer_18'] RETURN p.id 。因此,请尝试将查询更改为:

'10'

即:将10更改为:

  

此外,我找不到标记关系的方法。这不是   公认。 [R:* 0..3]。

这是因为您没有在关系中使用类型。 [r:SOME_TYPE*0..3]仅与类型结合使用(例如,:)。以这种方式删除[r *0..3]MATCH (n)-[rs*]-() RETURN rs

修改

来自评论:

  

关于最后一句:它仍然有效,但它说“这个   功能已弃用,将在以后的版本中删除。捆绑   不推荐使用可变长度模式列表的关系“ -   user732456 3小时前

3.2.0-rc1以来,不推荐将关系绑定到可变长度模式中的列表。

根据pull request Cypher的查询:

MATCH p=(n)-[*]-() RETURN relationships(p) AS rs

将生成警告,并且编写相同查询的规范方法是:

| id     | domainIP        |
| foo    | 158.132.34.5    |
| bob    | 128.12.244.3    |
| bob    | 128.12.244.3    |
| bob    | 19.152.134.4    |
| bob    | 168.152.34.9    |
| alice  | 178.132.64.10   |
| alice  | 188.152.214.200 |
| peter  | 208.162.36.153  |
| peter  | 208.162.36.153  |
| peter  | 208.162.36.153  |
| peter  | 198.168.94.201  |