在Neo4j中,不能直接比较数组类型的关系属性
以下是一个使用Cypher查询语言比较数组类型关系属性的示例:
假设我们有一个简单的图,其中节点表示人,关系表示朋友关系:
(A:Person {name: 'Alice'})-[:FRIEND]->(B:Person {name: 'Bob'})
(A)-[:FRIEND]->(C:Person {name: 'Charlie'})
(B)-[:FRIEND]->(D:Person {name: 'David'})
我们想要找到与Alice和Bob都有共同朋友的人。我们可以使用以下Cypher查询:
MATCH (a:Person {name: 'Alice'})-[:FRIEND]-(commonFriend)-[:FRIEND]-(b:Person {name: 'Bob'})
RETURN DISTINCT commonFriend.name AS CommonFriends
这个查询首先找到Alice的朋友(commonFriend
),然后找到这些朋友也是Bob的朋友。最后,返回共同朋友的名字。
如果你想要比较两个关系属性数组是否相等,你可以使用FILTER
和ALL
函数。例如,假设我们有一个表示兴趣的关系属性数组:
(A:Person {name: 'Alice'})-[:INTERESTED_IN]->(:Interest {name: 'Reading'})
(A)-[:INTERESTED_IN]->(:Interest {name: 'Traveling'})
(B:Person {name: 'Bob'})-[:INTERESTED_IN]->(:Interest {name: 'Reading'})
(B)-[:INTERESTED_IN]->(:Interest {name: 'Traveling'})
我们可以使用以下查询来找到具有相同兴趣的人:
MATCH (a:Person)-[:INTERESTED_IN]->(interestA), (b:Person)-[:INTERESTED_IN]->(interestB)
WHERE a <> b AND size((a)-[:INTERESTED_IN]->()) = size((b)-[:INTERESTED_IN]->())
WITH a, b, collect(interestA) AS aInterests, collect(interestB) AS bInterests
WHERE all(x IN aInterests WHERE x IN bInterests)
RETURN DISTINCT a.name AS PersonWithSameInterests, b.name AS Friend
这个查询首先找到具有相同兴趣数量的人,然后使用all
函数比较两个数组是否相等。如果相等,则返回具有相同兴趣的人及其朋友。
领取专属 10元无门槛券
手把手带您无忧上云