首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索链接节点的任意集群Neo4j

搜索链接节点的任意集群Neo4j
EN

Stack Overflow用户
提问于 2016-12-07 14:27:51
回答 2查看 93关注 0票数 1

我是neo4j的新手。我已经设置了一个基本的数据库,大约有200个节点,其中包括人员、地址和电话号码。

它们都可以相互连接,因此一个人可以有一个电话号码和与之相关的地址,但一个地址可以连接到一个电话号码,电话号码可以连接到电话号码,人与人之间,等等。

我希望能够搜索一个节点集群,例如,我希望返回所有连接在其中的节点,例如:

  • 有一个人姓詹姆斯,
  • 另一个人姓琼斯,
  • 包含123456的电话号码
  • 带有AB11AB邮政编码的地址

对于上述的每一个结果,都可以找到多个结果,我希望找到一个集群,该集群至少链接上述每一个(最初连接到1级,但最终是可配置的级别)。我不在乎他们是如何联系的,只要他们是。

此外,可以搜索超过4个项(这是由用户配置的)。

我试着单独寻找它们,然后尝试将它们结合起来,并将它们收集起来,但我似乎无法正确地理解它们的逻辑。

一些返回相关节点的简单查询(为了了解我的数据):

代码语言:javascript
复制
MATCH (p:person {Surname:"james"}) RETURN a

MATCH (a:address {Postcode:"ab11ab"}) RETURN p

这个是可能的吗?

任何帮助都将受到欢迎。

谢谢,

琼恩

集群可能不是最好的术语,也许子图?

下面是一个场景:

代码语言:javascript
复制
CREATE (I1:person {description:'John James', FirstName:'John', Surname:'James'})
CREATE (I2:address {description:'1 Test Street ab11ab', Postcode:'ab11ab'})
CREATE (I3:contact {description:'01234567890 home telephone', Contact:'01234567890'})


CREATE (I4:person {description:'Frank James', FirstName:'Frank', Surname:'James'})
CREATE (I5:contact {description:'01234567899 home telephone', Contact:'01234567899'})


CREATE (I6:person {description:'Bert James', FirstName:'Frank', Surname:'James'})
CREATE (I7:person {description:'Brenda James', FirstName:'Brenda', Surname:'James'})
CREATE (I8:person {description:'Violet James', FirstName:'Violet', Surname:'James'})

CREATE (I9:address {description:'75 Test Street ab11ab', Postcode:'ab11ab'})

CREATE (I1)-[:LinkedTo]->(I2)
CREATE (I2)-[:LinkedTo]->(I3)

CREATE (I4)-[:LinkedTo]->(I5)

CREATE (I6)-[:LinkedTo]->(I7)
CREATE (I7)-[:LinkedTo]->(I8)

CREATE (I7)-[:LinkedTo]->(I9)

如果我运行以下命令:

代码语言:javascript
复制
MATCH (p:person)--(a:address)--(c:contact) 
    where p.Surname = "James"   AND 
          a.Postcode = "ab11ab" AND 
          c.Contact =~ "0123.*"  
RETURN p,a,c

我得到了我想要的集群。但是,如果我更改链接的顺序:

代码语言:javascript
复制
MATCH (p:person)--(c:contact)--(a:address) 
    where p.Surname = "James"   AND 
          a.Postcode = "ab11ab" AND 
          c.Contact =~ "0123.*"  
RETURN p,a,c

我什么也得不到。

我想问的是,我认识这个人,联系,地址,他们有任何联系吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 19:43:45

如果我正确理解,那么您应该得到一个所需节点的数组,然后找到连接每个人和每个人的所有路径。

代码语言:javascript
复制
// Get an array of all matching nodes:
OPTIONAL MATCH (p:person {Surname: "James"})
    WITH COLLECT(p) AS  c1
OPTIONAL MATCH (a:address {Postcode:"ab11ab"}) 
    WITH COLLECT(a)+c1 AS c2
OPTIONAL MATCH (c:contact) WHERE c.Contact =~ "0123.*" 
    WITH COLLECT(c)+c2 AS nodes
// Take the Cartesian product:
UNWIND nodes AS n1
  UNWIND nodes AS n2
      // Get path:
      MATCH p = (n1)-[*]-(n2) 
          WHERE ANY(n IN nodes WHERE n IN NODES(p) AND NOT n IN [n1,n2])
RETURN p
票数 0
EN

Stack Overflow用户

发布于 2016-12-07 18:42:48

这些查询可能会让您开始查询。

旁白:我建议您对不同类型的关系使用不同的关系类型(如HAS_ADDRESS__、HAS_CONTACT__和KNOWS__)。这将使您的查询更容易理解,并最终帮助您加快查询速度(因为您随后可以简化它们)。

  1. 若要查找任何姓"James“的人以任何方式与以”0123“开头的联系人联系: 匹配path=(p:person)-*-(c:contact),其中p.Surname = "James“,c.Contact = "0123.*”返回p,c
  2. 要找到任何姓"James“的人,只要他们之间的路径包括邮政编码为”ab11ab“的地址,以任何方式连接到以"0123”开头的联系人: 匹配path=(p:person)-*-(c:contact),其中p.Surname = "James“和c.Contact = "0123.*”以及任何(n IN节点(路径)1..-1,其中'address‘IN标签(N)和n.Postcode = "ab11ab")返回p,c
  3. 若要查找以任何方式连接到邮政编码为"ab11ab“的地址的姓"James”的人,只要他们之间的路径包括以“0123”开头的联系人: 匹配path=(p:person)-*-(a:地址)其中p.Surname = "James“和a.Postcode = "ab11ab”,以及任何(n IN节点(路径)1.-1,其中‘联系人’IN标签(N)和n.Contact = "0123.*")返回p,a
  4. 要找到任何姓"James“的人,他以任何方式连接到邮政编码为"ab11ab”的地址,并以"0123“开头的联系人(对于大DB来说可能比较慢): 匹配(p:person {姓氏:"James"})可选匹配path1 = (p)-*-(c:contact),其中c.Contact =~ "0123.*“与p,c,[n IN节点(Path1)1.-1,其中'address‘IN LABELS(n)和n.Postcode = "ab11ab"]作为加载项可选匹配path2 =(P)-*-(a:地址),其中a.Postcode = "ab11ab”与p,c,addrs +a作为加载项,[n在节点(Path2)1.-1,其中'contact‘IN标签(N)和n.Contact =~ "0123.*"]作为conts,p,addrs,conts +c作为cont展开,cont作为cont,addrs,COLLECT( cont)作为cont,当cont大小( conts )>0时,将加号解压为addr,conts,n.Contact作为加载项,在其中大小( addr) >0,返回p,conts,addr。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41019993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档