我正在尝试加深对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
操作吗?我想知道一个详尽的清单(对还是错)。
答案 0 :(得分: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
标签。
在节点上放置标签(或多个标签,适当时)通常是一个好主意,因为在执行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