我是neo4j的新手。我已经设置了一个基本的数据库,大约有200个节点,其中包括人员、地址和电话号码。
它们都可以相互连接,因此一个人可以有一个电话号码和与之相关的地址,但一个地址可以连接到一个电话号码,电话号码可以连接到电话号码,人与人之间,等等。
我希望能够搜索一个节点集群,例如,我希望返回所有连接在其中的节点,例如:
对于上述的每一个结果,都可以找到多个结果,我希望找到一个集群,该集群至少链接上述每一个(最初连接到1级,但最终是可配置的级别)。我不在乎他们是如何联系的,只要他们是。
此外,可以搜索超过4个项(这是由用户配置的)。
我试着单独寻找它们,然后尝试将它们结合起来,并将它们收集起来,但我似乎无法正确地理解它们的逻辑。
一些返回相关节点的简单查询(为了了解我的数据):
MATCH (p:person {Surname:"james"}) RETURN a
MATCH (a:address {Postcode:"ab11ab"}) RETURN p这个是可能的吗?
任何帮助都将受到欢迎。
谢谢,
琼恩
集群可能不是最好的术语,也许子图?
下面是一个场景:
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)如果我运行以下命令:
MATCH (p:person)--(a:address)--(c:contact)
where p.Surname = "James" AND
a.Postcode = "ab11ab" AND
c.Contact =~ "0123.*"
RETURN p,a,c我得到了我想要的集群。但是,如果我更改链接的顺序:
MATCH (p:person)--(c:contact)--(a:address)
where p.Surname = "James" AND
a.Postcode = "ab11ab" AND
c.Contact =~ "0123.*"
RETURN p,a,c我什么也得不到。
我想问的是,我认识这个人,联系,地址,他们有任何联系吗?
发布于 2016-12-07 19:43:45
如果我正确理解,那么您应该得到一个所需节点的数组,然后找到连接每个人和每个人的所有路径。
// 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发布于 2016-12-07 18:42:48
这些查询可能会让您开始查询。
旁白:我建议您对不同类型的关系使用不同的关系类型(如HAS_ADDRESS__、HAS_CONTACT__和KNOWS__)。这将使您的查询更容易理解,并最终帮助您加快查询速度(因为您随后可以简化它们)。
https://stackoverflow.com/questions/41019993
复制相似问题