在Neo4j中具有所有多种类型的关系

时间:2015-11-20 23:40:26

标签: neo4j cypher

我正在尝试从TYPE1和TYPE2中获取节点,但在文档中它只列出了如何为TYPE1或TYPE2执行此操作

(a)-[r:TYPE1|TYPE2]->(b)

是否有运营商作为"和"

3 个答案:

答案 0 :(得分:4)

所以你要找的是关系类型的ALL谓词。

基本上,这也意味着节点bx之间的关系至少为a,其中x是您作为参数传递的不同关系类型的数量。

此处使用WITH

模拟关系类型参数列表
WITH ['typeA','typeB'] as validTypes
MATCH (a)-[r]->(b)
WITH b, collect(distinct(r)) as types, validTypes
WHERE ALL(x in validTypes WHERE x IN types)
RETURN b

如果你通过将validTypes作为查询参数传递来执行相同的操作,它将如下所示:

MATCH (a)-[r]->(b)
WITH b, collect(distinct(r)) as types
WHERE ALL(x in {validTypes} WHERE x IN types)
RETURN b

以下是一个示例控制台:http://console.neo4j.org/r/3zdml9

答案 1 :(得分:0)

关系只能有一种类型。所以在你给出的例子中:

(a)-[r:TYPE1|TYPE2]->(b)

变量r绑定为TYPE1TYPE2的关系。匹配TYPE1TYPE2的关系是没有意义的,因为这种关系不存在。

如果您尝试匹配具有多个标签节点,您可以这样做:

MATCH (a:Person)
MATCH (a:Agent)
RETURN a

a只会是同时包含PersonAgent标签的节点。

答案 2 :(得分:0)

Cypher没有and来检查节点a,b有TYPE1TYPE 2。 但是你可以尝试在这样的地方写TYPE2

match (a)-[r:TYPE1]-(b)
where ((a)-[:TYPE2]-(b))
return a,b

您也可以像这样使用with

match (a)-[r:TYPE1]-(b)
with a,b
match (a)-[r2:TYPE2]-(b)
return a,b

希望这些代码能为您提供帮助。