Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用匹配与多个子句导致奇数结果

使用匹配与多个子句导致奇数结果
EN

Stack Overflow用户
提问于 2015-04-03 07:59:46
回答 2查看 79关注 0票数 2

我正在用Neo4j 2.0.4编写一个Cypher查询,该查询试图获取所选节点的入站和出站关系总数。当我只在同一时间使用这个查询时,我可以很容易地做到这一点,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g1:someIndex{name:"name1"})
MATCH g1-[r1]-()
RETURN count(r1);
//Returns 305

MATCH (g2:someIndex{name:"name2"})
MATCH g2-[r2]-()
RETURN count(r2);
//Returns 2334

但是,当我尝试用两个节点一起运行查询(即获得g1和g2的关系总数)时,我似乎得到了一个奇怪的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g1:someIndex{name:"name1"}), (g2:someIndex{name:"name2"})
MATCH g1-[r1]-(), g2-[r2]-()
RETURN count(r1)+count(r2);
//Returns 1423740

由于某种原因,这个数字比305+2334的总数大得多。

似乎其他Neo4j用户在使用多个MATCH子句时遇到了奇怪的问题,因此我阅读了Michael在https://groups.google.com/d/msg/neo4j/7ePLU8y93h8/8jpuopsFEFsJ上的解释,该解释建议Neo4j用户使用WITH来传递一次匹配的结果,以避免“标识符唯一性”。但是,当我运行以下查询时,它只是超时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g1:gene{name:"SV422_HUMAN"}),(g2:gene{name:"BRCA1_HUMAN"})
MATCH g1-[r1]-()
WITH r1
MATCH g2-[r2]-()
RETURN count(r1)+count(r2);

我怀疑这个查询不会返回,因为r1返回了很多记录。在这种情况下,如何在两个节点上操作“获取关系号”查询?我只是使用了一些不正确的语法,还是我的“每次2节点”查询的逻辑存在一些根本问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-03 08:40:06

您的第一个问题是,当您这样做时,您正在返回一个笛卡儿产品:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g1:someIndex{name:"name1"}), (g2:someIndex{name:"name2"})
MATCH g1-[r1]-(), g2-[r2]-()
RETURN count(r1)+count(r2);

如果有305个r1实例和2334个r2实例,则返回(3052334) == 711870行,并且由于要对此(count(r1)+count(r2))求和,总共将得到711870 + 711870 == 1423740。

第二个问题是,在这个查询的g2子句中,您没有携带WITH

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g1:gene{name:"SV422_HUMAN"}),(g2:gene{name:"BRCA1_HUMAN"})
MATCH g1-[r1]-()
WITH r1
MATCH g2-[r2]-()
RETURN count(r1)+count(r2);

您在第一个g2子句中匹配MATCH,但是当您只在第3行的WITH子句中传递r1时,就会留下它。然后,在第4行,当您在g2-[r2]-()上匹配时,您将匹配图形中的所有内容,因为g2已经解除绑定。

让我介绍一下Neo4j浏览器附带的电影数据集的解决方案,因为您还没有提供示例数据。比方说,我想知道汤姆·汉克斯和雨果·韦文的关系总数。

作为单独的查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (:Person {name:'Tom Hanks'})-[r]-()
RETURN COUNT(r)

=> 13

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (:Person {name:'Hugo Weaving'})-[r]-()
RETURN COUNT(r)

=> 5

如果我试图按您的方式来做,我将得到(13 * 5) *2 == 90,这是不正确的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (:Person {name:'Tom Hanks'})-[r1]-(), 
      (:Person {name:'Hugo Weaving'})-[r2]-()
RETURN COUNT(r1) + COUNT(r2)

=> 90

同样,这是因为我已经在r1r2的所有组合上进行了匹配,其中有65 (13 *5 == 65),然后将其加到总共90 (65 + 65 == 90)。

解决方案是使用DISTINCT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (:Person {name:'Tom Hanks'})-[r1]-(), 
      (:Person {name:'Hugo Weaving'})-[r2]-()
RETURN COUNT(DISTINCT r1) + COUNT(DISTINCT r2)

=> 18

显然,DISTINCT修饰符只计算每个实体的不同实例。

如果您需要,还可以使用WITH完成此任务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (:Person {name:'Tom Hanks'})-[r]-()
WITH COUNT(r) AS r1
MATCH (:Person {name:'Hugo Weaving'})-[r]-()
RETURN r1 + COUNT(r)

=> 18

笛卡尔产品的TL;DR。DISTINCT是你的朋友:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (:someIndex{name:"name1"})-[r1]-(), 
      (:someIndex{name:"name2"})-[r2]-()
RETURN COUNT(DISTINCT r1) + COUNT(DISTINCT r2);
票数 3
EN

Stack Overflow用户

发布于 2015-04-03 08:40:08

你所看到的结果的爆炸可以很容易地解释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g1:someIndex{name:"name1"}), (g2:someIndex{name:"name2"})
MATCH g1-[r1]-(), g2-[r2]-()
RETURN count(r1)+count(r2);
//Returns 1423740

在第2行中,来自g1的任何关系的每一个组合都与g2的任何关系相结合,这解释了自1423740 =3052334*2以来的数字。所以,你基本上是在评估一个交叉乘积。

计算name1name2所有关系之和的正确方法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (g:someIndex)-[r]-()
WHERE g.name in ["name1", "name2"]
RETURN count(r)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29435590

复制
相关文章
android获取状态栏高度
公司项目中使用了popWindow,并且需求指明了popWindow必须是和Activity类似的全屏模式,并且从页面底部弹出! 当popWindow所有设计完毕后,从底部弹出popWindow,发现设置在popWindow的上的titlebar一部分被压入状态栏的底部了,也就是说全屏是全屏了,但是超过了应有的部分! 解决方案: 为了达到良好的兼容性,我们可以如下变现代码 /** * 用于获取状态栏的高度。 * * @return 返回状态栏高度的像素值。 */ privat
xiangzhihong
2018/01/30
4.6K0
android获取textview展开渲染后的高度
    当你需要获取textview真正高度时,相信会有不少人会在onCreate函数中调用textview的getHeight()方法,简单粗暴,确实,这是个很方便的方法,但是不幸的是textview在onCreate中根本还没有展开,所以根本获取不到textview的真正高度,因此我们需要给textview绑定一个监听器,在渲染结束后调用,方法如下: ViewTreeObserver observer = contentView.getViewTreeObserver(); observer.a
forrestlin
2018/05/24
1.7K0
微信小程序如何获取组件实际高度
viewscroll-view scroll-x scroll-with-animation scroll-left="{{menuIndex}}" style="height: 100px; width:100%;"view id='#haha' class='all' style='width:{{menuWidth}}px;'block wx:key="lists" wx:for="{{li ...
疯狂的小程序
2018/01/22
3.6K0
微信小程序如何获取组件实际高度
js 获取浏览器高度和宽度值(多浏览器)
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 FireFox中: document.body.clientWidth ==> BODY对象宽度 document
似水的流年
2018/01/18
10.5K0
js 获取浏览器高度和宽度值(多浏览器)
js 获取浏览器高度和宽度值(多浏览器)
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 FireFox中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 Opera中: document.body.clientWidth ==> 可见区域宽度 document.body.clientHeight ==> 可见区域高度 document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高) 没有定义W3C的标准,则 IE为: document.documentElement.clientWidth ==> 0 document.documentElement.clientHeight ==> 0 FireFox为: document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高) Opera为: document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
似水的流年
2019/12/10
5.7K0
js 获取浏览器高度和宽度值(多浏览器)
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 FireFox中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 Opera中: document.body.clientWidth ==> 可见区域宽度 document.body.clientHeight ==> 可见区域高度 document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高) 没有定义W3C的标准,则 IE为: document.documentElement.clientWidth ==> 0 document.documentElement.clientHeight ==> 0 FireFox为: document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高) Opera为: document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
似水的流年
2018/01/12
7.7K0
如何获取变量token的值
1.客户端使用用户名跟密码请求登录 2.服务端收到请求,去验证用户名与密码 3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端 4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 LocalStorage 里,客户端每次向服务端请求资源的时候需要带着服务端签发的 Token 5.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据 6.web/APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回 token 到web/APP,以后web/APP请求时凡是需要验证的地方都要带上该 token,然后服务器端验证 token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上 token 设置一个有效期,每次web/APP请求的时候都验证token 和有效期。 二、如何获取token的值,进行接口测试
用户7880705
2020/10/29
14.5K0
js获取各种高度总结
在写js的时候偶尔需要获取各种高度,比如;浏览器高度,页面高度,滚动高度等。抽空整理了我自己常用到的,时间仓促,没有考虑到万恶的IE浏览器。。。。 获取屏幕的高度和宽度(屏幕分辨率): window.screen.height window.screen.width 获取屏幕工作区域的高度和宽度(去掉状态栏): window.screen.availHeight window.screen.availWidth 网页全文的高度和宽度: document.body.scrollHeight document
友儿
2022/07/27
12.6K0
JavaScript获取高度和宽度
屏幕分辨率为:screen.width screen.height 屏幕可用大小:screen.availWidth screen.availHeight 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽(包括边线的宽):document.body.offsetWidth 网页可见区域高(包括边线的宽):document.body.offsetHeight 网页正文全文宽:document.b
苦咖啡
2018/05/07
3.7K0
如何在onCreate中获取View的高度和宽度
在开发过程中经常需要获取到View的宽和高,可以通过View.getWidth()和View.getHeight()来得到宽高。然而新手们经常在onCreate方法中直接调用上面两个方法得到的值是0!
阳仔
2019/07/31
5.4K0
Javascript 获取div真实高度
第一种情况就是宽高都写在样式表里。           比如#div1{width:120px;}。这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度。 第二种情况就是宽和高是写在行内中。           比如style="width:120px;",这中情况通过上述2个方法都能拿到宽度。(什么是行内,就是直接在html标签上写样式) 小结,因为id.offsetWidth和id.offsetHeight无视样式写在样式表还是行内,所以我们
问天丶天问
2018/06/13
5.2K0
Android onActivityResult获取返回值的用法
现有 MainActivity,当它进入到 SecondActivity 后,在 SecondActivity 中进行了某些操作然后需要将值返回给 MainActivity 时,就需要用到 onActivityResult() 这个方法了,下面呢,我就具体来介绍一下用法。
用户8099761
2023/05/10
1.4K0
根据获取内部元素的高度,设置iframe的高度
iframe 是一个非常迷得一个元素,很难直接获取其内部元素的高度。 下面分享一个方法,可以获取 iframe 内部元素的高度: function setIframeHeight(id){     try{         var iframe = document.getElementById(id);         if(iframe.attachEvent){             iframe.attachEvent("onload", function(){                 i
德顺
2019/11/13
9.3K0
Android获取状态栏和标题栏的高度 博客分类: Android小技巧 Android
decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。 于是,我们就可以算出状态栏的高度了。
chroya
2018/10/31
1.5K0
ClientHeight_offsetheight获取高度不对
clientHeight:包括padding但不包括border、水平滚动条、margin的元素的高度。对于inline的元素这个属性一直是0,单位px,只读元素。
全栈程序员站长
2022/11/04
3.1K0
ClientHeight_offsetheight获取高度不对
js:如何获取select选中的值
<select id=”select”> <option value=”A” url=”http://www.baidu.com”>第一个option</option> <option value=”B” url=”http://www.qq.com”>第二个option</option> </select> 一:JavaScript原生的方法
全栈程序员站长
2022/11/04
26.8K0
jq获取文档和窗口高度
jquery获取窗口高度和窗口高度,$(document).height()、$(window).height()
93年的老男孩
2019/12/18
2K0
点击加载更多

相似问题

Android:如何获取文本高度

10

Android:如何获取视图的高度

30

如何使用索引值获取元素的高度

12

获取Android键盘高度

37

如何在android中获取未使用的窗口高度

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文