在Neo4J中,用什么密码查询来检索某些节点之间的关系?
TL:DR: 我需要找到最有效的Cypher查询,以获取连接到具有特定类型关系的特定节点类型的节点,然后检索这些节点之间的连接,筛选出前150个连接最紧密的节点,并将它们显示给用户 下面我建议使用APOC relationships属性查询,但我认为可以提高效率,所以我正在寻求您的建议 详细解释: 在我的数据模型中,我有以下类型的节点:在Neo4J中,用什么密码查询来检索某些节点之间的关系?,neo4j,cypher,neo4j-apoc,Neo4j,Cypher,Neo4j Apoc,TL:DR: 我需要找到最有效的Cypher查询,以获取连接到具有特定类型关系的特定节点类型的节点,然后检索这些节点之间的连接,筛选出前150个连接最紧密的节点,并将它们显示给用户 下面我建议使用APOC relationships属性查询,但我认为可以提高效率,所以我正在寻求您的建议 详细解释: 在我的数据模型中,我有以下类型的节点: CALL apoc.index.relationships('TO','user:15229100-b20e-11e3-80d3-6150cb20a1b9')
CALL apoc.index.relationships('TO','user:15229100-b20e-11e3-80d3-6150cb20a1b9')
YIELD rel, start, end
WITH DISTINCT rel, start, end
MATCH (ctx:Context)
WHERE rel.context = ctx.uid
AND (ctx.name="decon" )
RETURN DISTINCT start.uid AS source_id,
start.name AS source_name,
end.uid AS target_id,
end.name AS target_name,
rel.uid AS edge_id,
ctx.name AS context_name,
rel.statement AS statement_id,
rel.weight AS weight
:Concept
:Context
:User
:Statement
这用于文本网络分析,因此基本思想是:Concepts
出现在:Statements
中,属于特定:Context
由特定:User
添加的特定
它们还具有属性,例如uid
(唯一ID)和name
(名称)
每个:Concept
都通过有向关系的:to
类型连接到每个其他:Concept
如果:Concept
属于:Context
,则它与该:Context
具有:AT
关系
如果:Concept
是由:User
创建的,则它通过:by
类型的关系连接到该用户
我还向关系添加了属性,以便它们显示是哪个用户建立了:to
连接以及它们出现在哪个上下文中
我需要获得特定上下文中节点及其关系的列表,因此我目前使用以下类型的Cypher/APOC查询:
CALL apoc.index.relationships('TO','user:15229100-b20e-11e3-80d3-6150cb20a1b9')
YIELD rel, start, end
WITH DISTINCT rel, start, end
MATCH (ctx:Context)
WHERE rel.context = ctx.uid
AND (ctx.name="decon" )
RETURN DISTINCT start.uid AS source_id,
start.name AS source_name,
end.uid AS target_id,
end.name AS target_name,
rel.uid AS edge_id,
ctx.name AS context_name,
rel.statement AS statement_id,
rel.weight AS weight
它工作得很好,但是,问题是如果图很大(例如,超过1000个节点和5000个连接),那么查询它需要的时间太长
所以我希望能够过滤我得到的关系的数量
使用上面的请求很难做到这一点,因为我想过滤掉前150个连接最紧密的节点,我需要首先获取数据才能做到这一点
所以我想也许我应该改变我请求的逻辑,而不是:
1) 查询我感兴趣的:上下文
2) 获取所有连接到它的:概念节点
3) 查找检索到的:Concept
节点之间的所有关系
4) 获取连接最多的X(150)个:Concept
节点,忽略其余节点
5) 向用户显示它们
我尝试了以下查询:
MATCH (ctx:Context{name:'decon',by:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
WITH ctx MATCH (c1:Concept)-[:AT]->(ctx),
(c2:Concept)-[:AT]->(ctx)
WITH c1, c2
MATCH (c1)-[rel:TO]->(c2)
RETURN DISTINCT rel;
但这似乎需要更长的时间
我还需要过滤掉这些节点之间的关系,以便它们只显示某个:User
建立的关系,并且只显示在某个:Statement
中
有人知道我还能尝试什么吗
PS
源代码在中,您正在生成这些节点的笛卡尔乘积:概念节点,这会减慢查询速度
您可以尝试以下方法:
MATCH (c:Concept)-[:AT]->(:Context{name:'decon',by:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
WHERE (c)-[:BY]->(:User {uid:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
// AND <additional predicate for desired :Statement>
WITH collect(c) as concepts
UNWIND concepts as c
WITH c, size([(c)-[:TO]->(c2) WHERE c2 in concepts | c2]) as connections
ORDER BY connections DESC
LIMIT 150
RETURN c
MATCH(c:Concept)-[:AT]>(:Context{name:'decon',by:'15229100-b20e-11e3-80d3-6150cb20a1b9'))
其中(c)-[:BY]->(:User{uid:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
//及
以collect(c)为概念
将概念展开为c
使用c,size([(c)-[:TO]->(c2),其中c2在概念| c2]中)作为连接
按连接顺序说明
限额150
返回c
当然,您需要在:Context(by)上建立索引,以便快速进行初始匹配。您正在生成这些:Concept节点的笛卡尔积,这会减慢查询速度
您可以尝试以下方法:
MATCH (c:Concept)-[:AT]->(:Context{name:'decon',by:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
WHERE (c)-[:BY]->(:User {uid:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
// AND <additional predicate for desired :Statement>
WITH collect(c) as concepts
UNWIND concepts as c
WITH c, size([(c)-[:TO]->(c2) WHERE c2 in concepts | c2]) as connections
ORDER BY connections DESC
LIMIT 150
RETURN c
MATCH(c:Concept)-[:AT]>(:Context{name:'decon',by:'15229100-b20e-11e3-80d3-6150cb20a1b9'))
其中(c)-[:BY]->(:User{uid:'15229100-b20e-11e3-80d3-6150cb20a1b9'})
//及
以collect(c)为概念
将概念展开为c
使用c,size([(c)-[:TO]->(c2),其中c2在概念| c2]中)作为连接
按连接顺序说明
限额150
返回c
当然,您需要在:Context(by)上建立索引,以便快速进行初始匹配。谢谢!这个查询看起来不错,尽管它仍然比上面的查询(我有索引)要长一点,但它的方向是正确的。我想问你:这部分是什么意思:`概念中c2的位置| c2`垂直斜线?谢谢在这一行中,我们用来匹配一个模式,并将该模式的元素提取到一个列表中。这里的垂直斜杠是匹配的pattern+WHERE子句和用于填充列表元素的模式中要使用的表达式之间的分隔符。(在此查询中,我们仅生成此列表,以便获得其大小)。谢谢!这个查询看起来不错,尽管它仍然比上面的查询(我有索引)要长一点,但它的方向是正确的。我想问你:这部分是什么意思:`概念中c2的位置| c2`垂直斜线?谢谢在这一行中,我们用来匹配一个模式,并将该模式的元素提取到一个列表中。这里的垂直斜杠是匹配的pattern+WHERE子句和用于填充列表元素的模式中要使用的表达式之间的分隔符。(在这个查询中,我们只生成这个列表,以便获得它的大小)。