Cypher:检索多个类型的所有附加节点?

时间:2017-02-24 14:14:17

标签: neo4j cypher

初学者Cypher问题。我知道如何将特定类型的所有节点附加到我的数据库中的特定人员。在这里,我正在检索一个特定人的所有朋友,在10跳之内:

MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friends:Friend)
RETURN rebecca, friends

但是我如何扩展它以获得两种类型的节点:Rebecca的朋友或邻居?

2 个答案:

答案 0 :(得分:2)

您可以过滤好友标识符的标签:

MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(other)
WHERE ALL( x IN ["Friend","Neighbour"] WHERE x IN labels(other) )
RETURN rebecca, other

注意:InverseFalcon的答案完全有效,这里只是另一种方法来进行此过滤。

请注意,这不是很理想,FRIENDNEIGHBOUR在语义上最好被描述为关系,你可以在这里看到 远离自然的思维方式(关系很重要!)你在查询中会受到影响。

答案 1 :(得分:1)

我们可以在MATCH本身的标签上使用OR,因此您可能必须使用WHERE子句进行过滤:

from urllib.request import Request
myUrl = "http://aima.cs.berkeley.edu/data/iris.csv"
urlRequest = Request(myUrl)

请记住,像这样的可变长度关系匹配是为了找到所有可能的路径,直到给定的最大限制,所以这实际上是在做你可能不需要的额外工作,如果内部有很多关系,这可能会很慢那个本地图。

您可能需要考虑apoc.path.expandConfig() from APOC Procedures。如果你使用'NODE_GLOBAL'来表示唯一性,并用MATCH (rebecca:Person {name:"Rebecca"})-[r*1..10]->(friendOrNeighbor) WHERE friendOrNeighbor:Friend or friendOrNeighbor:Neighbor RETURN DISTINCT rebecca, friendOrNeighbor 指定上限,那么它就是一种更有效的方法,可以更快地获得你想要的节点。