Neo4j一直运行“ MATCH”

时间:2018-06-19 23:51:19

标签: neo4j cypher

我正在尝试加深对neo4j(3.4版)基础知识的理解。

我相信以下所有内容都会产生相同的结果-即它们是用于执行完全相同的操作的不同语法

MATCH (ee {name: "Emil"}) RETURN ee;
MATCH (ee) WHERE ee.name = "Emil" RETURN ee;
MATCH (ee:Person {name: "Emil"}) RETURN ee;
MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
MATCH (ee:Person) WHERE (ee).name = "Emil" RETURN ee;

我实际上有几个问题:

  • 在此列表中,有没有一种Node MATCH的“最佳”方式?显然,使用:Label可以提高效率,但是WHERE与prop贴图的效果却很神秘。

  • 所有这些都不正确吗?就是说,尽管它们起作用了,但这是一种意想不到的或特别糟糕的模式。

  • 除了此列表之外,还有其他方法可以进行MATCH操作吗?我想知道一个详尽的清单(对还是错)。

2 个答案:

答案 0 :(得分:1)

  1. 您的子句不尽相同。

    第一组(2)public class TechnicianRepository { private Connection connection; public TechnicianRepository() { try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("De Driver is geregistreerd!"); String URL = "jdbc:mysql://localhost/atm_installatie"; String USER = "root"; String PASS = "Br@h!em8891"; Connection conn = DriverManager.getConnection(URL, USER, PASS); System.out.println(connection); System.out.println(); } catch (ClassNotFoundException ex) { System.out.println("Error: unable to load driver class!"); System.exit(1); } catch (SQLException e) { e.printStackTrace(); } } public List<Technician> findAllRecords() { List<Technician> technicianList = new ArrayList<Technician>(); Statement stmt = null; try { stmt = connection.createStatement(); String sql = "SELECT * FROM Technician"; ResultSet rs = stmt.executeQuery(sql); System.out.println("Resultset: " + rs); while (rs.next()) { int tech_id = rs.getInt("tech_id"); String voornaam = rs.getString("voornaam"); String achternaam = rs.getString("achternaam"); String functie = rs.getString("functie"); String email_adres = rs.getString("email_adres"); String telefoonnummer = rs.getString("telefoonnummer"); System.out.println("Tech_ID: " + tech_id); System.out.println("Voornaam: " + voornaam); System.out.println("Achternaam: " + achternaam); System.out.println("Functie: " + functie); System.out.println("Email_Adres: " + email_adres); System.out.println("TelefoonNummer: " + telefoonnummer); technicianList.add(new Technician(tech_id, voornaam, achternaam, functie, email_adres, telefoonnummer)); technicianList.add(new Technician(rs.getInt("tech_id"), rs.getString("voornaam"), rs.getString("achternaam"), rs.getString("functie"), rs.getString("email_adres"), rs.getString("telefoonnummer"))); } rs.close(); } catch (SQLException e) { } finally { //if (stmt != null) { stmt.close(); } } return technicianList; } public class Applicatie { public static void main(String[] args) { TechnicianRepository technicianrepo = new TechnicianRepository(); List<Technician> technicianList = technicianrepo.findAllRecords(); for (Technician technician : technicianList) { System.out.println(technician); } 子句对于匹配的节点不需要MATCH标签。但是第二组(3)子句确实需要Person标签。

  2. 在节点上放置标签(或多个标签,适当时)通常是一个好主意,因为在执行Person时,在标签上进行匹配是过滤节点的快速方法。标签还有助于提高数据模型的可理解性。此外,如果您想index节点属性,则需要标签。

    但是您是否应该在特定的MATCH子句上指定一个(或多个)标签取决于您尝试执行的过滤量。如果您确实要在查询中匹配任何标签(甚至没有标签)的节点,那么从MATCH省略所有标签将是非常合适的。

答案 1 :(得分:1)

对于 详尽列表 ,您可以包括:

MATCH (ee) WHERE ee.name in ["Emil"] RETURN ee

这对于单个项目不是特别有用,但是您可以在列表或集合中使用多个以逗号分隔的项目。例如,

match (n:order{item:'widget'}) 
with collect(distinct n.customer_id) as customerCollection
match (c:Customers) where c.customer_id in [customerCollection]
return c.Name, c.City