Neo4j 关于关系基数的Cypher/Efficiency
使用Neo4j 2.X和Cypher,我想查询所有直接或通过朋友认识的Neo4j 关于关系基数的Cypher/Efficiency,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,使用Neo4j 2.X和Cypher,我想查询所有直接或通过朋友认识的用户 我希望这样: MATCH (me:User("123"))-[:KNOWS*1..2]-(friend) //does not work of course 我考虑了最短路径功能,但它不是太贵了吗 此外,如果我有这个问题: MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory
用户
我希望这样:
MATCH (me:User("123"))-[:KNOWS*1..2]-(friend) //does not work of course
我考虑了最短路径
功能,但它不是太贵了吗
此外,如果我有这个问题:
MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory before filtering by knowledge !
WITH shortestPath((me)-[:KNOWS*..2]-(friend)) as path
WHERE path.length <= 2
MATCH(a)-[:SOME_REL]->(b)我不确定自己是否完全理解,我想您的第一个查询是否可行
MATCH (me:User{userId:123})-[:KNOWS*1..2]-(friend:User)
WHERE me <> friend
RETURN friend
MATCH(me:User{userId:123})-[:KNOWS*1..2](朋友:User)
我的朋友在哪里
交友
很难知道为其他查询编写什么,因为OWNS\u BY和一些\u REL组件似乎与friend of friend组件无关,如果您可以将查询的两部分与具体示例联系起来,我可以解释一种最佳方法
一些关键点是你应该
以您认为匹配最小节点集的内容开始查询(以约束必须完成的工作)李>
确保所有查询组件都使用标签和关系类型
为将在查找中使用的属性创建索引
查询优化的一个优秀资源是
图的大小不需要使查询更昂贵,因为您将主要处理一个子图,该子图可能具有更固定大小的边界。当然,如果您的查询需要跨越整个图形,那么大小将成为速度的问题 为什么第一个查询不起作用?我只是阅读了文档,除了最短路径
,没有找到这个模式。。我认为该模式仅限于最短路径
所以,“OWNS\u BY和某些\u REL组件似乎与friend of a friend组件无关”=>事实上,这只是一个示例。您写道:“以您认为匹配最小节点集的内容开始查询”。这是否意味着应该拆分此查询?:MATCH(a)-[:SOME_REL]->(b)(b)感谢Wes的链接,我现在理解拆分的好处;):从最小匹配(就返回的节点而言)开始,它将过滤整个匹配,以简化和简化第二个匹配。
MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS*1..2]-(friend)
OPTIONAL MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS]-(friend)
OPTIONAL MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS]-()-[:KNOWS]-(friend)
MATCH (me:User{userId:123})-[:KNOWS*1..2]-(friend:User)
WHERE me <> friend
RETURN friend