在Neo4J中,用什么密码查询来检索某些节点之间的关系?

在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')

TL:DR:

我需要找到最有效的Cypher查询,以获取连接到具有特定类型关系的特定节点类型的节点,然后检索这些节点之间的连接,筛选出前150个连接最紧密的节点,并将它们显示给用户

下面我建议使用APOC relationships属性查询,但我认为可以提高效率,所以我正在寻求您的建议

详细解释:

在我的数据模型中,我有以下类型的节点:

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子句和用于填充列表元素的模式中要使用的表达式之间的分隔符。(在这个查询中,我们只生成这个列表,以便获得它的大小)。