路径查询如何返回路径上所有信息
发布于 6 年前 作者 liutianling 8875 次浏览 来自 问答

我要查询这样的路径 match p=(n:Person{name:“甄姬”})-[r*2…2]-(m) return p 这是我的返回结果 (甄姬)<-[:None {}]-(刘备)-[:None {}]->(貂蝉) 这是我想要的结果 (甄姬)<-[:knows]-(刘备)-[:love]->(貂蝉)

也就是我希望路径上的关系也返回在结果中,查询语句该怎么写?

33 回复

你要解析p(在这里是路径的集合)中的每个关系

@graphway 谢谢,如果这样写也能返回我要的结果 match p=(n:Person{name:“甄姬”})-[r*2…2]-(m) return n,r,m 我不懂您说的解析是什么意思,是提取p中的信息吗,但是p中关系是None。。。

match p=(n:Person{name:“甄姬”})-[r*2…2]-(m) return p 这样P里面也包含节点和关系啊。都有

@bingo 讲道理p里面是包含有节点和关系的,我把查询结果打印出来 query1 = 'match p=(m:Person{name:“甄姬”})-[r:love]-(n) return p limit 10’ data = graph.run(query1).data() for path in data: print(path) 这里是打印的结果: {‘p’: (甄姬)-[:None {}]->(关羽)} {‘p’: (甄姬)<-[:None {}]-(刘备)} 我期望的结果是{‘p’: (甄姬)-[knows]->(关羽)}, 用路径返回的话不知道该怎么写了

你把这个cypher放到后台用cypher-shell 里面执行,你可以发现是返回了节点和关系的 至于你前端打印,估计是你python没有打印出来。

@bingo 谢谢你,可能是没有答应出来吧,我在web端查询的结果关系也是显示的没有内容{}

match p=(m:Person{name:“甄姬”})–(n) return p limit 10 ╒══════════════════════════════════════════════════════════════════════╕ │"p" │ ╞══════════════════════════════════════════════════════════════════════╡ │[{“add”:“苏州”,“name”:“甄姬”,“gender”:“female”,“age”:18},{},{“add”:“四川”,“n│ │ame”:“关羽”,“gender”:“male”,“age”:58}] │ ├──────────────────────────────────────────────────────────────────────┤ │[{“add”:“苏州”,“name”:“甄姬”,“gender”:“female”,“age”:18},{},{“add”:“四川”,“n│ │ame”:“刘备”,“gender”:“male”,“age”:38}] │ └──────────────────────────────────────────────────────────────────────┘

@liutianlin 这样return的时候可能只能返回节点和关系的属性吧?如果是要关系的类型,试试自己通过字符串拼接来打印吧

这样返回估计只返回节点和关系的属性,类型该怎么搞?

match p=(m:Person{name:“甄姬”})–[r]-(n) return p limit 10

楼主你的问题解决了吗,我也遇到了同样的问题,不过我在web端查询发现是有这些信息的,但是返回的就是None

@hitzhs 返回就是None的话应该是节点或者边的属性是空导致的吧?试试9楼那个type(rel)来返回边的属性,labels用来返回节点标签

@zhoujieren64 不是的,在web端是能看到属性和标签的,但是返回的就是None

@zhoujieren64 用type(rel)来返回边的属性是可以的,但是直接返回path就显示none,而且下午我发现这个返回none的不是全部,使部分,就是有的path里属性什么的都返回了,有的返回的none,现在还在找原因。。。

@hitzhs web端你看的是graph吧?切到Text这边返回的应该就是和shell执行结果一样的了

@hitzhs type只能返回relation的类型,不返回边的具体属性。 你说的这种情况我感觉是有些path里的边有property,有些边没有property shell里执行return path 通常是不显示节点labels和边的relation的,整个path是由节点和边的property构成的

@zhoujieren64 我看的是text,里面是有具体的数据的,包括那些返回none的部分,text里也是有数据的

@zhoujieren64 而且查询结果时好时坏,昨天后来不知道怎么的,返回的就不是none了,打算今天再看看情况,早上返回的又是none了。。。

@hitzhs o(╯□╰)o定位不到问题,可以的话贴一段结果上来?

@hitzhs 我上面贴的表格就是text的结果,关系部分就是空的,暂时没有弄了,要不你试试先返回路径p,然后再取p中关系看看

@zhoujieren64 传不了图。。这是py2neo的语句graph.run(‘MATCH (ee:Person)-[re:KNOWS]-(friends) RETURN ee, friends,re’).totable() ,现在返回的结果是正常的(_3491:Person {from: ‘Sweden’, klout: 99, name: ‘Emil’}), (_3493:Person {from: ‘Belgium’, name: ‘Ian’, title: ‘author’}) ,(Emil)-[:KNOWS {rating: 5}]->(Ian),不过有时返回的是这样的(_3491:Person {from: ‘Sweden’, klout: 99, name: ‘Emil’}), (_3493:Person {from: ‘Belgium’, name: ‘Ian’, title: ‘author’}) ,(Emil)-[:None {}]->(Ian),一样的代码,但是结果不一样。。。

@hitzhs直接返回ee,friends,type(re)这样返回是没有问题的,你可以试试 另外,我最开始的本意,是没有指定关系的,比如我就就是查询A到B之间的一度关系的所有路径,

@hitzhs 看不出啥问题,可能需要大佬来救场了o(╯□╰)o

@zhoujieren64 代码放在那里,我都没动过,昨天一天都返回的正常的,今天早上又是none了,真是醉了

@hitzhs 你现在是每天早上都会none么

@zhoujieren64 不一定,是个概率时间,今天就没问题,感觉出现none的频率越来越低了。。

@hitzhs 数据库跑起来先预热一下?不过估计没啥用哈哈

以下是一个查询路径,并解析路径的例子. 返回:时间戳,关系id列表,节点属性norm列表

        match p=(n:outside)-[*0..4]-(n_e:outside)
        where  n.pid in ["f7bd95d804494e5f43eabb3ce2f50449"] and n_e.pid in ["8e1de718b750a0a01092ad4d26f09ef9"] 
        return timestamp() as batch,extract(x IN relationships(p)|id(x)) as rel_id,extract(x IN relationships(p)|100.0-toFloat(coalesce(x.norm,100.0))) as distance,length(p) as length
        order by length asc
        limit 10

@nonono 这个查询将路径中的relation的结果单独提取出来了吧?为啥说是解析路径的例子

@zhoujieren64 我不清楚你对解析的定义,动手尝试一下就知道了.
这只是个例子,可以将 路径上的关系也返回在结果中,需要别的字段自行添加.

@nonono 这个明白,看楼主的需求感觉是要整个path的聚合结果,所以不知道这样通过relationships把路径的关系分开提取出来是否适合他的需求

@liutianling 你好,我也遇到你提出的这个问题,请问前辈现在已经解决这个问题了吗?如果找到了解决方法能否分享一下,谢谢前辈

这个只是Browser或cypher-shell的显示,在json的数据内容中是有路径的完整信息。如果用驱动,可以参考下面的例子: StatementResult result = session.run(“MATCH path=(e:Entity) -[]- () RETURN path”); Path current = result.single().get(“path”).asPath(); Iterator<Relationship> relsIterator = current.relationships().iterator(); Map<String, Object> rels = new HashMap<>(); while (relsIterator.hasNext()) { Relationship support = relsIterator.next(); rels.put(support.type(), support); }

回到顶部