在我的Neo4j应用程序中,我有一个产品、产品特性和每个产品在特定特性上的选票列表(带有双重权重)。
为了按照平均得票权对一个特征列表进行排序,我需要执行一个复杂的运行时Cypher查询,该查询将为每个产品的特征列表计算一个平均权重的总和。
这是我当前的Cypher查询:
MATCH (parentP:Product)-[:CONTAINS]->(childP:Product)
WHERE id(parentP) = {productId}
WITH childP
OPTIONAL MATCH (p:Product)<-[:VOTED_FOR]-(v:Vote)-[:VOTED_O
我正在尝试使用下面的Cypher查询在Neo4j中计算一个无向图的传递闭包("E“是图的每条边都有的标签):
MATCH (a) -[:E*]- (b) WHERE ID(a) < ID(b) RETURN DISTINCT a, b
我试图在一个有10k个节点和大约15万条边的图上执行这个查询,但即使在8小时后它也没有完成。我对此感到惊讶,因为即使是最简单的SQL解决方案也要快得多,而且我预计Neo4j对于这些标准图形查询会更高效。那么,我是否遗漏了什么,可能是对Neo4j服务器进行了一些调整,或者是编写查询的更好方法?
编辑
以下是对上述查询执行EXPLAIN的结果:
+--
假设我有一个图,其中每个用户都有标签' user‘和属性'name’,根据Neo4j 2.0文档,我们可以使用下面的cypher命令创建索引
CREATE INDEX ON :user(name);
但是,如果使用START子句编写Cypher查询,如下所示:
start n=node:user(name='john') return n
那么我将得到以下错误
MissingIndexException: Index `user` does not exist
我的问题是如何首先定义索引的名称。我知道在Neo4j 2.0中,使用start子句是可选的。但是,如果
我有一个相当大的社交图,我在其中执行如下的全局查询:
match (n:User)-[r:LIKES]->(k:User)
where not (k:User)-[]->(n:User)
return count(r);
它们占用了大量的时间和内存,所以我很好奇它们是否以最佳的方式表达。我有一种感觉,当我执行这样的查询时,Cypher首先匹配符合表达式的所有内容(这需要大量内存),然后开始计数。我宁愿遍历每个节点,检查模式,并在必要时更新计数器。这样,这样的查询将不需要大量的内存。那么,这样的查询实际上是如何执行的呢?如果它不是最优的,有没有办法让它变得更好(用Cypher)?
我使用Neo4j 2.1.7和Node.js来构建REST。数据--大约70.000个节点和100.000个关系--包含许多小的连通子图。
一个API调用,例如localhost:8000/search?name=Bussum,应该返回名为Bussum的所有节点以及它们所属的连接组件。
说明:
(图片来源于)
我可以通过这样的查询获得所需的所有数据:
MATCH (a {name: "Bussum" })-[r*]-(b)
UNWIND rels AS rel
RETURN distinct startNode(rel) AS a, type(rel), endN
我使用嵌入在java应用程序中的Neo4j社区版进行推荐。我制作了一个自定义函数,其中包含比较两个实体(即产品和用户)的复杂逻辑。这两个实体都以节点的形式出现在图中,每个实体都有20多个属性,用于比较。例如。我将以以下格式调用此函数:
match (e:User {user_id:"some-id"}) with e
match (f:Product {product_id:"some-id"}) with e,f
return e,f,findComparisonValue(e,f) as pref_value;
此函数调用平均运行时间约为4-5毫秒。现在,
我一直试图获得一个基于节点查询的子图。只要子图中的所有节点都连接: ex: u1 -FRIEND-> u2 -FRIEND-> u3 u4 -FRIEND-> u5 -FRIEND-> u6,查询就应该忽略关系方向。
搜索u1、u2或u3,应该返回一组: u1、u2、u3
我使用了以下Cypher查询:
MATCH (a:User)-[:FRIEND_OF*0..]-(b)
WHERE a.userId = 'some_id'
WITH a, collect(DISTINCT b) AS sets
RETURN DISTINCT sets
问题是,我得到
我有以下Neo4j Cypher查询
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision)
WHERE dg.id = 1
MATCH (childD)-[relationshipValueRel4:HAS_VALUE_ON]-(filterCharacteristic4:Characteristic)
WHERE filterCharacteristic4.id = 4
WITH relationshipValueRel4, childD, dg
WHERE (ANY (id IN [2,3]
WHERE id I
我正在努力理解编写Cypher查询的最合适和最可伸缩的方法。
现在我有两种方法
具有纯直接匹配的#1:
MATCH ( childD:Vacancy )
WHERE exists { MATCH (childD)-[:EMPLOYMENT_AS]-(req0:Requirable) WHERE req0.id IN [21, 22, 23, 24]}
AND exists { MATCH (childD)-[:WORK_TIME_ZONE]-(req1:Requirable) WHERE req1.id IN [11, 12, 13, 14]}
AND exists { M
当使用Cypher时,下面的查询实际上将根据需要遍历所有可能的路径。
START n=node(0)
MATCH (n)-[]-(p1:Person)
RETURN n
但是我想要的是:一旦找到一个子图,就停止遍历,并返回结果,告诉我它匹配。怎么做?就像在MATCH上给我一个MATCH?但据我所知,LIMIT只在RETURN而不是MATCH上工作。
我们正在为我们的应用程序评估Neo4J,在一个小型测试数据库中测试它,该数据库共有20K节点、150 K属性和100 K关系。分支因子为~100关系/节点。服务器和版本信息低于1。Cypher查询如下:
MATCH p = ()-[r1:RATES]-(m1:Movie)-[r2:RATES]-(u1:User)-[r3:RATES]-(m2:Movie)-[r4:RATES]-()
RETURN r1.id as i_id, m1.id, r2.id, u1.id, r3.id, m2.id, r4.id as t_id;
(第一个和最后一个空节点对我们来说并不重要,但我不知道如何从关系开始
我正试图使用Cypher投影来创建我的图形的子图,因为我想使用GDS库。首先,我正在使用Cypher查询创建一个子图,它工作得非常好。以下是查询:
// Filter for only recurrent events
WITH [path=(m:IDHcodel)--(n:Tissue)
WHERE (m.node_category = 'molecular' AND n.event_class = 'Recurrence')
AND NOT EXISTS((m)--(:Tissue{event_class:'Primary'})) |
我想在neo4j中用py2neo计算一个很大的图中的中间度。
我使用的密码查询如下:
MATCH p=allShortestPaths((source:DOLPHIN)-[*]-(target:DOLPHIN))
WHERE id(source) < id(target)
AND length(p) > 1
UNWIND nodes(p)[1..-1] as n
RETURN n.name, count(*) as betweenness
ORDER BY betweenness DESC
它适用于小图,但不工作于有100万节点的大图。我使用py2neo传递了这个查询。
当执行Cypher查询以检索具有自同构的特定子图时,假设
MATCH (a)-[:X]-(b)-[:X]-(c),
RETURN a, b, c
似乎默认的行为是返回每个检索到的子图及其所有的自同构。在该示例中,如果(u)-:X-(v)-:X-(w)是与该模式匹配图,则输出将是u,v,w,但也是w,v,u,它们位于同一图中。
有没有办法让每个子图只检索一次?
编辑:如果Cypher在搜索中有一个功能来做这件事,使用某种对称破坏条件,那就太好了,因为它可以减少计算时间。如果不是这样,您将如何进行后处理以找到所需的输出?
我想要查询一个包含两个可互换节点的结构的Neo4j图,但我不希望每个“对称”响应都有两个唯一的响应。 如何在Cypher中表示两个节点是可互换的? 举个例子: 我想用以下查询在图中查找以下结构: MATCH (c:Customer)-[]->(p:Purchase)
MATCH (c:Customer)-[]->(q:Purchase)
MATCH (p)-[]->(m:Company)
MATCH (q)-[]->(m:Company)
RETURN DISTINCT c, p, q, m ? Neo4j的默认行为是返回以下两个图形: ? ? (即p
我有一个大约有800k个节点的图,我想使用Cypher在它们之间创建随机关系。
下面的例子不起作用,因为笛卡尔乘积太大了:
match (u),(p)
with u,p
create (u)-[:LINKS]->(p);
例如,我希望每个节点有1个关系(800k),或者每个节点有10个关系(8M)。
简而言之,我需要一个查询Cypher来统一创建节点之间的关系。有人知道以这种方式创建关系的查询吗?